共通コンテキスト
Qmonus SDKでは、Scenarioサーバで定義管理するプラグインを様々なプログラミングスポットから利用するための共通コンテキストを提供しています。 これにより、様々なプラグインから共通的に利用する部品をモジュール化することが可能になります。
context
プラグインモジュール、及びファンクションを格納するダイナミックコンテキストです。module
、function
リソースを作成すると本コンテキスト配下に収容され、すぐに利用することができます。
プラグインモジュールに含まれる関数呼び出しは以下のように記述します。
# sampleModuleのhello関数を呼び出す例
context.sampleModule.hello()
プラグインファンクション関数呼び出しは以下のように記述します。
# sampleFunction関数を呼び出す例
context.sampleFunction()
Tip
プラグインモジュールやファンクションの実行空間でも後述するatom
やmodel
のリファレンスを利用できます。
Note
Scenario
のプログラミング空間におけるcontext
には、プラグインモジュール/ファンクション以外にHTTPセッションに関する情報が追加で格納されます。詳しくは、Scenarioにおけるプログラミング
の章を参照してください。
Warning
import
文使用時の注意事項
作成した Module, Function をimport
文でimportしようとすると想定した動作にならない可能性があります。Qmonus SDK ではcontext
を使用するようにしてください。
atom
ATOMクラスを格納するダイナミックコンテキストです。class
リソースを作成すると本コンテキスト配下にクラスオブジェクトが収容され、すぐに利用することができます。
o = atom.Human(name="Adam")
ATOMインスタンスは、上述したコンストラクタによる生成以外にATOMコンテキストのatom.instantiation
クラスメソッドで生成する方法があります。
atom.instantiation
は、yaml
もしくはjson
文字列、あるいはdict
のインスタンス化パラメータからインスタンスを生成します。
>>> yamltext = """↵
... Tenant:↵
... tenant_name: hoge↵
... networks:↵
... - Network:↵
... name: nw1↵
... subnets:↵
... - Subnet:↵
... name: subnw1↵
... - Subnet:↵
... name: subnw2↵
... """↵
... ↵
↵
>>> tenant = await atom.instantiation(yamltext)↵
... print(tenant)↵
... ↵
↵
Tenant(instance='VGVuYW50OjhhYzczYWMyM2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge', description=None, networks=[Network(instance='TmV0d29yazo4YWM2Y2FlMjNiNDIxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw1', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjhhYzZiMGU4M2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw1', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjhhYzZiZWRhM2I0MjExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw2', description=None, status=None, tenant_id=None, network_id=None)])])
>>>
Tip
atom.instantiation
に渡すデータはリスト型もサポートされています。以下のようにリスト型の場合は、インスタンスのリストが返却されます。
>>> yamltext = """↵
... - Tenant:↵
... tenant_name: hoge1↵
... networks:↵
... - Network:↵
... name: nw1↵
... subnets:↵
... - Subnet:↵
... name: subnw1↵
... - Subnet:↵
... name: subnw2↵
... - Tenant:↵
... tenant_name: hoge2↵
... networks:↵
... - Network:↵
... name: nw2↵
... subnets:↵
... - Subnet:↵
... name: subnw3↵
... - Subnet:↵
... name: subnw4↵
... - Example:↵
... name: test↵
... """↵
... ↵
↵
>>> instances = await atom.instantiation(yamltext)↵
>>> print(instances)↵
... ↵
↵
[Tenant(instance='VGVuYW50OjQ5MzZiN2ZjM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge1', description=None, networks=[Network(instance='TmV0d29yazo0OTM2NWRjYTNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw1', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjQ5MzY0ODA4M2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw1', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjQ5MzY1NDEwM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw2', description=None, status=None, tenant_id=None, network_id=None)])]), Tenant(instance='VGVuYW50OjQ5MzgzMGQyM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, tenant_id=None, tenant_name='hoge2', description=None, networks=[Network(instance='TmV0d29yazo0OTM3ZTU4MjNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, id=None, name='nw2', description=None, status=None, tenant_id=None, subnets=[Subnet(instance='U3VibmV0OjQ5MzdkNDhlM2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw3', description=None, status=None, tenant_id=None, network_id=None), Subnet(instance='U3VibmV0OjQ5MzdkZDc2M2I0NDExZWI4YWQyYWNkZTQ4MDAxMTIy', xid=None, xname=None, id=None, name='subnw4', description=None, status=None, tenant_id=None, network_id=None)])]), Example(instance='RXhhbXBsZTo0OTM5NWM3ODNiNDQxMWViOGFkMmFjZGU0ODAwMTEyMg==', xid=None, xname=None, name='test', region=None, description=None, hogeID=None, createdAt=None)]
>>>
model
データベーステーブルを格納するダイナミックORM(Object-relational mapping)コンテキストです。modelschema
もしくはclass
リソースを作成すると本コンテキスト配下にテーブルオブジェクトが収容され、すぐに利用することができます。
データベース接続は、次の構文でasync with
を使用する必要があります。model
配下には、データベース接続機能を提供するaiodb
コンテキストマネージャとプラグインによって生成されたテーブルオブジェクトが格納されています。
async with model.aiodb() as conn:
cursor = await conn.execute(model.employee.select())
employees = await cursor.fetchall()
データベーストランザクションは以下のように記述します。
async with model.aiodb() as conn:
async with conn.begin() as tran:
cursor = await conn.execute(model.employee.select().where(model.employee.c.status=="retired"))
employees = await cursor.fetchall()
[await conn.execute(model.employee.delete().where(model.employee.c.id==i.id)) for i in employees]
SQL組込クラスを利用して以下のような記述も可能です。
# SQLAlchemy
employees = await SQL.run(model.employee.select())
# Raw SQL statement
employees = await SQL.run("SELECT * FROM employee;")
# When using SQL function in transaction scope
async with model.aiodb() as conn:
async with conn.begin() as tran:
employees = await SQL.run(model.employee.select(), conn=conn)