Skip to main content

組み込み Python からの InterSystems IRIS の呼び出し

組み込み Python から InterSystems IRIS を呼び出すための鍵となるのが、iris Python モジュールです。iris モジュールは、組み込み Python から InterSystems IRIS の機能を利用できるようにする多数のメソッドを提供します。また、Python クラスのように InterSystems IRIS クラスにアクセスできるようにします。

ここでは、組み込み Python から InterSystems IRIS の機能を使用する方法に関する、いくつかの基本的な例を示します。

その他の例については、"Python からの InterSystems IRIS API の呼び出し" を参照してください。

iris モジュールによって公開される最も重要な API の詳しい説明は、"InterSystems IRIS Python モジュール・リファレンス" を参照してください。

iris モジュールの使用

iris Python モジュールを使用すると、InterSystems IRIS を操作してそのトランザクション処理機能を使用したり、グローバル (InterSystems IRIS のすべてのストレージの基盤となるデータ構造) にアクセスしたり、InterSystems IRIS API およびクラスにアクセスしたり、組み込み Python を ObjectScript でスムーズに動作させるためのユーティリティ・メソッドを呼び出すことができます。

import コマンドを使用して、他の Python モジュールと同様に、組み込み Python から iris モジュールを使用します。

import iris
Note:

%SYS.PythonOpens in a new tab クラスの Shell() メソッドを使用した Python シェルの実行時に、iris モジュールを明示的にインポートする必要はありません。このコンテキストでのみ、インポートはバックグラウンドで行われます。

iris モジュールをインポートした後、他の Python モジュールと同様にそのメソッドを呼び出します。

例えば、tstart() メソッドを使用して、InterSystems IRIS でのトランザクションの開始を示します。

iris.tstart()

InterSystems IRIS クラスの使用

iris モジュールを使用して、InterSystems IRIS クラスへの参照を返すことができます。これにより、組み込みのシステム・クラスや、ご自身やチームの誰かが記述したカスタム・クラスに容易にアクセスできます。

システム・クラスの名前がパーセント記号 (%) で始まる場合、任意のネームスペースからそのクラスにアクセスできることを示します。システム・クラスの名前がパーセント記号で始まらない場合は、%SYS ネームスペースからクラスにアクセスする必要があります。

例えば、クラス %Regex.MatcherOpens in a new tab は、正規表現を使用してパターン・マッチングを実行するオブジェクトを作成します。以下の例では、文字列内のすべての市外局番を見つけて、それらを市外局番 212 に置き換えます。

メソッド %New() を使用するのが、InterSystems IRIS クラスの新しいインスタンスを作成する標準的な方法です。

Python のクラス名とメソッド名には % 文字を使用できないため、アンダースコア (_) で置き換える必要があることに注意してください。

>>> import iris
>>> matcher = iris._Regex.Matcher
>>> m = matcher._New('\((\d{3})\)')
>>> m.Text = '(617) 555-1212, (202) 555-1313, (415) 555-1414'
>>> print(m.ReplaceAll('(212)'))
(212) 555-1212, (212) 555-1313, (212) 555-1414

これに関する詳細、および他のシステム・クラスの詳細は、"インターシステムズ・クラス・リファレンスOpens in a new tab" を参照してください。

カスタム・クラスもほぼ同じように機能します。関連する複数のメソッドの論理グループを作成でき、多くの場合、クラス %PersistentOpens in a new tab (%Library.PersistentOpens in a new tab の略称) を拡張します。これにより、InterSystems IRIS データベースにクラスのオブジェクトを格納できるようになります。

GitHub の Samples-Data リポジトリ (https://github.com/intersystems/Samples-DataOpens in a new tab) には、学習用のサンプル・クラス (サンプル・データを含む) があります。SAMPLES という名前の専用ネームスペースを作成し、そのネームスペースにサンプルをロードすることをお勧めします。

以下に、クラス Sample.Person の抜粋を示します。

Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
/// Person's name.
Property Name As %String(POPSPEC = "Name()") [ Required ];

/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];

/// Person's Date of Birth.
Property DOB As %Date(POPSPEC = "Date()");

/// A collection of strings representing the person's favorite colors.
Property FavoriteColors As list Of %String(JAVATYPE = "java.util.List", 
POPSPEC = "ValueList("",Red,Orange,Yellow,Green,Blue,Purple,Black,White""):2");

/// Person's age.
/// This is a calculated field whose value is derived from DOB.
Property Age As %Integer [ Calculated, SqlComputeCode = { Set {Age}=##class(Sample.Person).CurrentAge({DOB})
}, SqlComputed, SqlComputeOnChange = DOB ];

/// This class method calculates a current age given a date of birth date.
/// This method is used by the Age calculated field.
ClassMethod CurrentAge(date As %Date = "") As %Integer [ CodeMode = expression ]
{
$Select(date="":"",1:($ZD($H,8)-$ZD(date,8)\10000))
}
}

person オブジェクトには、NameSSNDOBFavoriteColorsAge など複数のプロパティがあることがわかります。DOB プロパティは、$HOROLOG 形式でのその人物の生年月日です。FavoriteColors プロパティは、文字列のリストです。Age プロパティは、メソッド CurrentAge() を使用して、その人物の生年月日から年齢を計算する計算フィールドです。

以下の例では、現在のネームスペースを SAMPLES ネームスペースに変更し、Sample.Person の新しいインスタンスを作成し、そのプロパティを設定してデータベースに保存します。

>>> import iris
>>> iris.system.Process.SetNamespace('SAMPLES')
'SAMPLES'
>>> p = iris.Sample.Person._New()
>>> p.Name = 'Doe,John'
>>> p.SSN = '000-00-0000'
>>> p.DOB = iris._Library.Date.DisplayToLogical('04/24/1999')
>>> print(p.Age)
25
>>> p.FavoriteColors.Insert('Red')
1
>>> p.FavoriteColors.Insert('Blue')
1
>>> p._Save()
1
>>> print(p._Id())
201

先ほど確認したように、%New() メソッドは Sample.Person のインスタンスを作成し、%Save() メソッドはそれをデータベースに保存します。%Library.Date.DisplayToLogical() メソッドは日付文字列を取得し、$HOROLOG 形式に変換して保存します。最後に、リスト・プロパティの Insert() メソッドは、新しい要素をリストに挿入します。

この例では、Insert() メソッドと %Save() メソッドはすべて 1 を返すことに注意してください。これらは InterSystems IRIS ステータス・コードの例で、1 はメソッドの実行中にエラーが発生しなかったことを示します。多くの場合、iris.check_status() を使用してこのステータス・コードを確認し、発生する可能性のあるエラー・ケースに対処します。

InterSystems IRIS では、オブジェクトの保存時に自動的に ID (この場合は 201) を割り当てます。

Note:

InterSystems IRIS 2024.2 より、組み込み Python から InterSystems IRIS クラスを参照するための、オプションの短い構文が導入されました。新しいフォームも従来のフォームもどちらも使用できます。

InterSystems SQL の使用

InterSystems IRIS 内の永続クラスは SQL に投影されるため、InterSystems SQL を使用するクエリでデータにアクセスできるようになります。上記のクラス Sample.Person は、同じ名前のテーブルに投影されます。

以下の例では、赤が好きな色の 1 つであるすべての人物の ID、名前、年齢を選択します。

>>> sql = iris.sql.prepare('SELECT ID, Name, Age FROM Sample.Person WHERE FOR SOME %ELEMENT(FavoriteColors) (%Value = ?)')
>>> rs = sql.execute('Red')
>>> for idx, row in enumerate(rs):
...     print(f'{idx} = {row}')
...
0 = ['14', 'Roentgen,Sally S.', 78]
1 = ['30', 'Vanzetti,Jane A.', 73]
2 = ['38', 'Vanzetti,Heloisa W.', 8]
3 = ['61', 'Gibbs,Zoe J.', 81]
4 = ['72', 'Klingman,Pat E.', 55]
5 = ['89', 'Beatty,Mario Q.', 91]
6 = ['91', 'Ott,Jeff Z.', 54]
7 = ['97', 'Van De Griek,Kirsten B.', 49]
8 = ['101', 'Newton,Barbara A.', 51]
9 = ['105', 'Hertz,Yan M.', 90]
10 = ['129', 'Leiberman,Mo U.', 54]
11 = ['133', 'Zubik,George X.', 95]
12 = ['137', 'Jung,Lawrence T.', 83]
13 = ['147', 'Ubertini,Nataliya D.', 71]
14 = ['150', 'Ravazzolo,Sally S.', 84]
15 = ['187', 'Nichols,Terry F.', 64]
16 = ['196', 'Houseman,David D.', 97]
17 = ['200', 'Ng,James T.', 36]
18 = ['201', 'Doe,John', 25]

先ほど入力した John Doe のレコードを含め、19 のレコードが返されることがわかります。

任意の ObjectScript コマンドの実行

ObjectScript で任意のコマンドを実行できると便利なことがあります。組み込み Python から ObjectScript コマンドをテストしたり、ObjectScript 関数特殊変数にアクセスしたい場合などです。

カスタマ・サポートに問い合わせる必要が生じた場合に、カスタマ・サポートから InterSystems IRIS のバージョン文字列 $ZVERSION (または略称の $ZV) を尋ねられることがあります。この特殊変数には、使用している InterSystems IRIS のバージョンや、ビルド番号などその他詳細を含む文字列が含まれています。

以下の例は、組み込み Python から $ZVERSION の値を書き込む方法を示しています。

>>> iris.execute('write $zversion, !')
IRIS for Windows (x86-64) 2024.1 (Build 267_2U) Tue Apr 30 2024 16:35:10 EDT

または、$ZVERSION の値を返して、その値を Python 変数に格納することができます。

>>> zv = iris.execute('return $zversion')
>>> print(zv)
IRIS for Windows (x86-64) 2024.1 (Build 267_2U) Tue Apr 30 2024 16:35:10 EDT

この場合、API を使用して $ZVERSION を取得する同等の方法もありますが、この方法が他の特殊変数や関数でも常に適しているわけではありません。

>>> print(iris.system.Version.GetVersion())
IRIS for Windows (x86-64) 2024.1 (Build 267_2U) Tue Apr 30 2024 16:35:10 EDT
FeedbackOpens in a new tab