Pesquisar

Artigo
· Set. 3 2min de leitura

大量データをJSON形式で渡す方法

これは InterSystems FAQ サイトの記事です。
 

ダイナミックオブジェクトの%ToJSONメソッドを利用することで簡単にJSONデータを送信することができます。

但し、標準的な方法では、出力するJSONのデータがIRIS文字列の最大長(約32万文字 正確には$SYSTEM.SYS.MaxLocalLength()が返す値)を超えると<MAXLENGTH>エラーとなります。

これを回避するためには、文字列として返すのではなく、%ToJSONメソッドの出力先としてStreamを指定し、その結果作成されたそのStreamデータを順次読み取って、出力先に書き出すようにする必要があります。

以下のように処理できます。

ClassMethod bigjson() As %Status [ ProcedureBlock = 0 ]

{

   set x={}

   for i=1:1:100 { 

       set cmd=" set x.a"_i_" = ^a "    ;; ^aのサイズは1MB
       xecute cmd

   }


   set tmpStream = ##class(%Stream.GlobalCharacter).%New()

   do x.%ToJSON(tmpStream) 

   while tmpStream.AtEnd'=1 {

       write tmpStream.Read(1000)

   }

   quit $$$OK
}

 

なお、このような処理はREST APIの実装として用いられることが多いと想定されますが、あまりの大量データを一度にREST経由で送信することは、ネットワーク帯域の逼迫や応答時間の増大等の影響が懸念されるため、その処理の適切性について十分考慮する必要があり、場合によっては、他の方法を検討した方が良いケースもあります。

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Set. 3 3min de leitura

JSON_OBJECT/JSON_ARRAYに関する既知の制限事項/不具合

これは InterSystems FAQ サイトの記事です。
 

JSON利用の普及に伴いインターシステムズは、JSONに関連する様々な機能強化をIRISに対して行なっています。

その一環として、SQLのJSON_OBJECTのサポートがあります。

この機能に関して現時点より(2025年6月)古いバージョンでは残念ながら制限や不具合が存在しています。

今後も機能強化やバグフィックスを継続していく予定となっているため、この機能の利用を検討および既に利用している方は最新バージョンでのご利用をお勧めします。

ここでは、現時点でわかっている制限事項/不具合についてお知らせします。

 

  • VIEW経由でJSON_OBJECTを利用した場合にエラーとなる場合がある 以下のようなクラスとVIEWを定義します。  
Class User.test Extends %Persistent
{

  Property p1 As %String;
  Property p2 As %String;
}
Class User.myview [ ClassType = view, ViewQuery = { select p1 as v10, p1 as v11, p2 as v12 from test } ] { }

 

この定義に対してデータを登録後、以下のようなSQL文を発行すると、<UNDEFINED>エラーが発生します。

select JSON_OBJECT('x':v10, 'y':v11) from myview 

 

以下のようなエラーメッセージが表示されます。

<UNDEFINED>%0AmBk1+4^%sqlcq.USER.cls47.1

 

ただしデータが0件の場合はエラーは発生しません。

この問題は、2025.2でも解決していません。

修正時期は未定です。

 

  • JSON _OBJECT内にJSON_ARAYAGGを含める場合の問題

 

サンプルとして提供しているSample.Personの定義をロードします。

サンプルデータの取得方法は以下をご参照ください。

サンプルデータの取得

データを生成(Populate)した後、以下のようなクエリーを発行します。

 

SELECT JSON_OBJECT('states': JSON_ARRAYAGG(Home_State) ) 
FROM Sample.Person WHERE Home_State %STARTSWITH 'D'

 

以下のような結果が返ってくる場合、それは正しい結果ではありません。

{"states":"[\"DE\",\"DE\",\"DE\",\"DE\",\"DE\"]"}

 

以下のような結果が正しいものになります。

{"states":["DE","DE","DE","DE","DE"]}

 

この問題は、2025.1以降のバージョンで修正されています。

 

  • SQLの中でCASE文を指定した場合に出力結果が正しくない場合がある。

 

以下のようなクラス定義とVIEW定義を作成します。

Class JSON.Person Extends %Persistent [ DdlAllowed, ProcedureBlock, SqlRowIdPrivate, SqlTableName = J_PERSON ]
{

Property USERID As %String [ SqlColumnNumber = 2, SqlFieldName = USER_ID ];
Property NAME As %String [ SqlColumnNumber = 3, SqlFieldName = NAME ];
Property SEX As %String [ SqlColumnNumber = 4, SqlFieldName = SEX ];
Index IdxPerson On USERID [ Type = index, Unique ];
}

Class JSON.PersonView [ ClassType = view, CompileAfter = JSON.Person, DdlAllowed, Not ProcedureBlock, SqlTableName = J_PERSON_VIEW, ViewQuery = { SELECT A.USER_ID As USERID, A.NAME As NAME, CASE A.SEX WHEN 'M' THEN '1' ELSE '0' END AS ISMALE FROM J_PERSON A } ] {         データを登録します。 

 

データを登録します。 

insert into JSON.J_PERSON values ('1','TARO','M'); 
insert into JSON.J_PERSON values ('2', 'HANA', 'F')

 

以下のようなクエリーを発行します。

SELECT USERID ,NAME ,ISMALE FROM JSON.J_PERSON_VIEW

 

以下のようにISMALEの値が文字列型として出力されます。

 "1", "TARO", "1"
 "2", "HANA", "0"

次に以下のようなクエリーを発行します。

SELECT JSON_OBJECT( 'userid':USERID ,'name':NAME ,'ismale':ISMALE ) FROM JSON.J_PERSON_VIEW; 

 

以下のようなJSONデータが返ってきます。

 {"userid":"1", "name":"TARO", "ismale":1}

 {"userid":"2", "name":"HANA", "ismale":0}

 

この結果は誤りです。

ismaleに関しては、数字ではなくリテラル(文字)として返すのが正しい動作です。

この問題は2025.1以降のバージョンで修正されています。

Discussão (0)1
Entre ou crie uma conta para continuar
Artigo
· Set. 3 1min de leitura

MacでDockerを動かす選択肢 Colima

以前はMac上でDockerを動かす場合は、Docker for Macを使用していましたが、ある時点でマルウェア判定されてしまい、削除されてしまいました。

以下の記事によれば、最新版では解決しているようです。

Docker Desktop for Macがエラーで起動できない件(#7527)についての情報

そこで他の選択肢はないか調べてみるといくつか選択肢がありました。

その中でColimaというのがあり、設定してみました。

Colima で Docker と Docker Compose を使ってみた

設定も非常に簡単であり、実際のdockerやdocker composeの動かし方はほとんど変わりません。

一つColimaの方が良いと感じたのは、Docker for Macの場合、IRISのスクリプトの実行の結果として出力されるメッセージは、スクロールされて、Dockerコンテナの起動が終了すると、痕跡が残らないため途中でエラーが発生してもその場で確認できませんでしたが、Colimaの場合、ターミナル上で垂れ流されるだけなので、そのターミナルのスクリーンをロールバックすることで出力メッセージを確認できる点です。

Discussão (0)1
Entre ou crie uma conta para continuar
Pergunta
· Set. 3

Undefined IRIS attribute in Embedded Python

Hi Guys,

I'm a newbie in Python and I've imported this class from another IRIS and for some reason its get an error on %ToJSON()?

I'm also wondering on the need of importing iris at the top given that this code is already running in IRIS!? 

Thanks

3 Comments
Discussão (3)2
Entre ou crie uma conta para continuar
Anúncio
· Set. 2

Managing InterSystems Servers – In-Person September 29-October 3, 2025 / Registration space available

Managing InterSystems Servers – In-Person  September 29-October 3, 2025

  • Configure, manage, plan, and monitor system operations of InterSystems Data Platform technology
  • This five-day course teaches system and database administrators how to install, configure and secure InterSystems server software, configure for high availability and disaster recovery, and monitor the system. Students also learn troubleshooting techniques.
  • This course is applicable to both InterSystems IRIS and Caché. Although the course is mostly platform independent, students can complete the exercises using either Windows or Ubuntu.
  • Self-Register Here
Discussão (0)1
Entre ou crie uma conta para continuar