Python からのデータベース・オブジェクトの制御
Native SDK は、インターシステムズの外部サーバと連携し、外部の Python アプリケーションが ObjectScript または組み込み Pythonで記述されたデータベース・クラスのインスタンスを制御できるようにします。Native SDK の逆プロキシ・オブジェクトでは、外部サーバ接続を使用して、ターゲット・データベース・オブジェクトを作成したり、ターゲットのインスタンス・メソッドを呼び出したり、ターゲットがネイティブの Python オブジェクトであるかのように容易にプロパティ値を取得または設定したりすることができます。
このセクションでは、以下のトピックについて説明します。
-
Python 外部サーバの概要 — 外部サーバの概要を示します。
-
Python 逆プロキシ・オブジェクトの作成 — 逆プロキシ・オブジェクトの作成に使用するメソッドについて説明します。
-
IRISObject によるデータベース・オブジェクトの制御 — 逆プロキシ・オブジェクトの使用法を示します。
Python 外部サーバの概要
Python 外部サーバによって、InterSystems IRIS 埋め込み言語オブジェクトと Python Native SDK オブジェクトは同じ接続を使用して、同じコンテキスト (データベース、セッション、トランザクション) で自由に相互作用することができます。外部サーバのアーキテクチャについては "InterSystems 外部サーバの使用法" で詳しく説明していますが、ここでは、これを、一方の側のプロキシ・オブジェクトをもう一方の側のターゲット・オブジェクトに接続する単純なブラック・ボックスとして考えることができます。
図に示すように、フォワード・プロキシは、外部の Python ターゲット・オブジェクトを制御するデータベース・オブジェクトです。対応する Native SDK オブジェクトは、通常の制御フローを逆転させ、外部 Python アプリケーションからデータベースのターゲット・オブジェクトを制御する逆プロキシです。
Python 逆プロキシ・オブジェクトの作成
逆プロキシ・オブジェクトを作成するには、データベース・クラス・インスタンスの OREF を取得 (例えば、ObjectScript クラスの %New() メソッドを呼び出して) します。IRIS.classMethodObject() および IRIS.functionObject() メソッドは、その呼び出しが有効な OREF を取得する場合、IRISObject インスタンスを返します。以下の例では、IRIS.classMethodObject() を使用して、逆プロキシ・オブジェクトを作成します。
proxy = irispy.classMethodObject("User.TestInverse","%New");
-
classMethodObject() 呼び出しは、User.TestInverse という名前の ObjectScript クラスの %New() メソッドを呼び出します。
-
%New() の呼び出しは、User.TestInverse のデータベース・インスタンスを作成します。
-
classMethodObject() は、逆プロキシ・オブジェクト proxy を返します。これは、データベース・インスタンスにマップされた IRISObject のインスタンスです。
この例は、irispy が接続された IRIS のインスタンスであると想定しています (“Python での接続の作成” を参照してください)。クラス・メソッドの呼び出し方法の詳細は、“Python からのデータベース・メソッドおよび関数の呼び出し” を参照してください。
以下のセクションでは、proxy を使用して ObjectScript の User.TestInverse インスタンスのメソッドとプロパティにアクセスする方法を説明します。
IRISObject によるデータベース・オブジェクトの制御
iris.IRISObject クラスは、データベース・ターゲット・オブジェクトを制御するいくつかの方法を提供します。invoke() と invokeVoid() は、それぞれ戻り値ありとなしでインスタンス・メソッドを呼び出します。get() と set() は、それぞれプロパティ値を取得、設定します。
この例では、User.TestInverse という ObjectScript クラスを使用しています。これには、メソッド initialize() および add() とプロパティ name の宣言が含まれています。
Class User.TestInverse Extends %Persistent {
Method initialize(initialVal As %String = "no name") {
set ..name = initialVal
return 0
}
Method add(val1 As %Integer, val2 As %Integer) As %Integer {
return val1 + val2
}
Property name As %String;
}
次の例の 1 行目で、User.TestInverse の新しいインスタンスを作成し、逆プロキシ・オブジェクト proxy を返します。これはデータベース・インスタンスにマップされます。残りのコードでは、proxy を使用してターゲット・インスタンスにアクセスします。irispy という名前の IRIS の接続済みインスタンスが既に存在することが前提とされています (“Python での接続の作成” を参照)。
# Create an instance of User.TestInverse and return an inverse proxy object for it
proxy = irispy.classMethodObject("User.TestInverse","%New");
# instance method proxy.initialize() is called with one argument, returning nothing.
proxy.invokeVoid("initialize", "George");
print("Current name is "+ proxy.get("name")); # display the initialized property value
# instance method proxy.add() is called with two arguments, returning an int value.
print("Sum of 2 plus 3 is " + str(proxy.invoke("add",2,3)));
# The value of property proxy.name is displayed, changed, and displayed again.
proxy.set("name", "Einstein, Albert"); # sets the property to "Einstein, Albert"
print("New name is "+ proxy.get("name")); # display the new property value
この例では、以下のメソッドを使用して、User.TestInverse インスタンスのメソッドとプロパティにアクセスします。
-
IRISObject.invokeVoid() は、initialize() インスタンス・メソッドを呼び出します。このメソッドは、プロパティを初期化しますが、値は返しません。
-
IRISObject.invoke() は、インスタンス・メソッド add() を呼び出します。このメソッドは、2 つの整数の引数を受け入れて、合計を整数として返します。
-
IRISObject.set() は、name プロパティを新しい値に設定します。
-
IRISObject.get() は、name プロパティの値を返します。
この例では、get() および invoke() メソッドのバリアントを使用しましたが、IRISObject クラスでは、サポートされるデータ型用に型キャスト・メソッドも提供します:
get() メソッドのバリアントに加えて、IRISObject は getBytes()、getDecimal()、getFloat()、getInteger()、getString()、getIRISList()、および getObject() の IRISObject.get() 型キャスト・メソッドを提供します。
invoke() および invokeVoid() に加えて、IRISObject は invokeBytes()、invokeDecimal()、invokeInteger()、invokeString()、invokeIRISList()、および invokeObject() の IRISObject.invoke() 型キャスト・メソッド を提供します。
すべての invoke() メソッドは、methodName の str 引数に加え、0 個以上のメソッド引数を取ります。引数は、Python オブジェクトか、サポートされるデータ型の値のいずれかです。サポートされていない型の引数に対しては、データベース・プロキシが生成されます。
invoke() は、IRISObject インスタンスのインスタンス・メソッドのみ呼び出すことができます。クラス・メソッドの呼び出し方法については、“Python からのデータベース・メソッドおよび関数の呼び出し” を参照してください。