如何将Python 2.6连接到OSI PI?
我正在使用pyodbc
来管理我的数据库连接。我试图连接到OSI PI数据库,并收到此错误:如何将Python 2.6连接到OSI PI?
pyodbc.Error: ('IM002', "[IM002] [OSI][PI ODBC][PI]PI-API Error <pilg_getdefserverinfo> 0 (0) (SQLDriverConnectW); [01000] [Microsoft][ODBC Driver Manager] The driver doesn't support the version of ODBC behavior that the application requested (see SQLSetEnvAttr). (0)")
与供应商交谈后,我得到了这样的响应: Looks like pyodbc is written against ODBC 3.x. The OSI PI ODBC driver is using ODBC 2.0. The python ODBC driver manager will convert most ODBC 3 calls on the fly to ODBC 2 ones. Anything added to 3, however, will obviously fail. You would need to find some way to make sure that your only using 2.0 compliant ODBC calls. Currently their is not a PI ODBC driver that is compliant with ODBC 3.0.
我的代码我相当简单只是试图在这一点上连接:
import pyodbc
constr = 'DRIVER={PI-ODBC};SERVER=myserver;UID=MY_UID'
pyodbc.pooling=False
conn = pyodbc.connect(constr) # Error at this line
conn.close()
有没有人连接到OSI PI的Python?如果是这样,你是怎么做到的?如果不是,并且您仍然使用OSI数据库中的数据,那么最终如何访问它?
我想通了,如何做到这一点。不过,我不得不改用pyodbc
。相反,我用win32com来做这个。
例
from win32com.client import Dispatch
oConn = Dispatch('ADODB.Connection')
oRS = Dispatch('ADODB.RecordSet')
oConn.ConnectionString = "Provider=PIOLEDB;Data Source=<server>;User ID=<username>;database=<database>;Password=<password>"
oConn.Open()
if oConn.State == 0:
print "We've connected to the database."
db_cmd = """SELECT tag FROM pipoint WHERE tag LIKE 'TAG0001%'"""
oRS.ActiveConnection = oConn
oRS.Open(db_cmd)
while not oRS.EOF:
#print oRS.Fields.Item("tag").Value # Ability to print by a field name
print oRS.Fields.Item(0).Value # Ability to print by a field location
oRS.MoveNext()
oRS.Close()
oRS = None
else:
print "Not connected"
if oConn.State == 0:
oConn.Close()
oConn = None
注:
- 这需要由OSIsoft公司提供的PIOLEDB驱动器被安装在运行该代码的机器上。
- 这种方法的性能似乎并不可怕。我能够用一些其他查询撤回数十万条记录,并且在可接受的时间内返回
在使用它几个月之后,请继续关注此事。这仍然是我发现用python做这件事的唯一方式,但是当我需要运行大量查询时,它似乎非常慢。我怀疑这是因为我必须打开/关闭每个查询的数据库连接,但是如果我不这样做,OSI PI/ADODB会抱怨。性能尚未达到我不得不重写这一点。如果/当我这样做,我会再次跟进。与此同时,使用此解决方案的其他人应该意识到,在运行许多查询时,速度很慢。 – Andy 2012-04-15 01:24:10
您使用的是什么版本的OSI PI? – bud 2016-02-18 20:24:28
@bud - PI Server:3.4.390.18; PIOLEDB:3.3.1.2 – Andy 2016-02-18 20:35:26
我有使用'R'' RODBC'软件包连接到PIODBC的问题。症状是所有查询返回零行。解决的办法是设置'RODBC'一次获取一行('rows_at_time = 1')以及('believeNRows = FALSE'),因为PI ODBC驱动程序搞乱了行数。 http://stackoverflow.com/q/7425100/176995 – 2012-06-12 00:52:13