Python インターフェイスを使用して、インターシステムズ キャッシュ グローバルに直接アクセスして反復処理することはできますか?それとも、Python は、リンク サーバーまたは ODBC 接続を使用するときに表示されるのと同じ「テーブル」を公開するだけですか?
2012 次
2 に答える
1
グローバルに直接アクセスしたい場合は、そのためのストアド プロシージャを作成できます。これを行う前に、セキュリティへの影響を考慮する必要があります。これにより、グローバルのすべてのデータが ODBC アクセスを持つすべての人に公開されます。
最大 9 つのグローバル添え字の値とそのノードの値を返すストアド プロシージャの例を次に示します。必要に応じて、非常に簡単に変更できます。
Query OneGlobal(GlobalName As %String) As %Query(ROWSPEC = "NodeValue:%String,Sub1:%String,Sub2:%String,Sub3:%String,Sub4:%String,Sub5:%String,Sub6:%String,Sub7:%String,Sub8:%String,Sub9:%String") [SqlProc]
{
}
ClassMethod OneGlobalExecute(ByRef qHandle As %Binary, GlobalName As %String) As %Status
{
S qHandle="^"_GlobalName
Quit $$$OK
}
ClassMethod OneGlobalClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = OneGlobalExecute ]
{
Quit $$$OK
}
ClassMethod OneGlobalFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = OneGlobalExecute ]
{
S Q=qHandle
S Q=$Q(@Q) b
I Q="" S Row="",AtEnd=1 Q $$$OK
S Depth=$QL(Q)
S $LI(Row,1)=$G(@Q)
F I=1:1:Depth S $LI(Row,I+1)=$QS(Q,I)
F I=Depth+1:1:9 S $LI(Row,I+1)=""
S AtEnd=0
S qHandle=Q
Quit $$$OK
}
Python からこれにアクセスするには、(pyodbc を使用して) 次を使用できます。
import pyodbc
import win32com.client
import urllib2
class CacheOdbcClient:
connectionString="DSN=MYCACHEDSN"
def __init__(self):
pass
def getGlobalAsOverlyLargeList(self):
connection=pyodbc.connect(self.connectionString)
cursor=connection.cursor()
cursor.execute("call MyPackageName.MyClassName_OneGlobal ?","MYGLOBAL")
list=[]
for row in cursor :
list.append((row.NodeValue,row.Sub1,row.Sub2,row.Sub3,row.Sub4,row.Sub5,row.Sub6,row.Sub7,row.Sub8,row.Sub9))
return list
于 2012-03-17T03:26:30.977 に答える
1
Python には、ODBC 接続 (テーブルが表示されます) と Python バインディング (クラスが表示されます) の 2 種類のキャッシュ アクセスがあります。必要に応じてキャッシュ グローバルを反復処理するクラスを作成し、Python バインディングから使用することができます。Cache に Python バインディングに関するドキュメントがあります。http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GBPY
于 2011-12-20T23:15:15.413 に答える