Intersystems Cache - Python可用于直接访问全局或仅作为sql表公开的类吗?

时间:2011-12-20 00:52:21

标签: python intersystems-cache

可以使用python接口直接访问并迭代一个intersystems缓存全局,还是python只是暴露了我在使用链接服务器或ODBC连接时看到的相同“表”?

2 个答案:

答案 0 :(得分:1)

Python中有两种类型的缓存访问 - ODBC连接(您将看到您的表)和Python绑定(您将看到您的类)。您可以创建一个类,如果需要,将迭代Cache全局,然后从Python绑定中使用它。在Cache中有一个关于Python绑定的文档。 http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GBPY

答案 1 :(得分: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