使用python 3和OSX或Linux连接到Wonderware Historian OLE DB

时间:2017-02-01 01:31:29

标签: python wonderware

有没有人可以在OSX(或linux)上使用python3与Wonderware的Historian共享一个功能连接方法?

Historian显然是Microsoft SQL Server OLE DB(参见http://www.logic-control.com/datasheets/1/Historian/HistorianConcepts.pdf的第102页)。

另一篇SO帖子表明,唯一能够连接到OLE DB的python库是'adodbapi'(Connecting to Microsoft SQL server using Python

代码尝试(使用默认RO凭据):

adodbapi.apibase.OperationalError: (InterfaceError("Windows COM Error: Dispatch('ADODB.Connection') failed.",)...

这会出错:

{{1}}

错误可能是由于pywin32软件包缺失和不可用,显然只有Windows(Pywin32 (com objects) on Mac

小贴士表示赞赏。我非常怀疑微软与Mac / Linux世界在这种情况下无法弥合。

2 个答案:

答案 0 :(得分:3)

您应该能够使用Python访问MS SQL Server数据库(例如Wonderware Historian数据库)。

要检查的事项:

  • 对于ODBC,"可信连接"设置应该是"否"。可信连接意味着它尝试使用Windows身份验证登录。您希望使用用户名和密码。我认为对于OLE DB你设置"集成安全性= SSPI"代替。
  • 连接字符串(用户名,服务器主机名/ IP,数据库名称,正确端口,语法)
  • 端口(确保使用正确的端口 - 可能是非标准端口)
  • 防火墙 - 确保已设置任何防火墙以允许访问
  • 如果您正在使用主机名,请确保DNS正常运行(例如,您可以ping服务器吗?)
  • 您可能需要为Linux和pyodbc安装ODBC驱动程序。 ODBC是一个更开放的标准。正如您所指出的,OLEDB是基于COM的(例如基于Windows的),因此我不确定它是否兼容。

答案 1 :(得分:1)

我可以通过sqlalchemy和Linux上的Windows上的pyodbc使用Python3访问Wonderware服务器 - 我没有Mac,所以你自己就在那里。我已经读过有其他可用的驱动程序,但我对它们没有任何经验。如果您有任何建议,我很高兴听到他们的意见。

这是我模块化pyodbc功能的方式。本质上,我在代码中定义了一个设置sql引擎conncetion的函数:

def get_conn():
    conn_pyodbc = pyodbc.connect(DSN=<myDSN>, UID=<user>, PWD=<pass>)
    return conn_pyodbc

我使用连接:

def executeQuery(sql_query):
    with get_conn() as conn:
        df = pd.read_sql(sql_query, conn)

使用上下文管理器似乎是处理打开和关闭数据库连接的一种更简单的方法。

至于设置DSN,我需要安装Microsoft ODBC驱动程序,这很容易通过我在网上找到的一些链接来完成。安装成功后,我手动编辑了/etc/odbc.init和/etc/odbcinst.ini文件,使它们现在看起来像这样:

$ cat /etc/odbc.ini 
[myDSN]
Driver=ODBC Driver 13 for SQL Server
Description=Awesome server
Trace=No
Server=<serverIP>

$ cat odbcinst.ini 
[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.1
UsageCount=1

根据我的经验,您可以使用“可信连接”,但这意味着您的计算机将尝试使用其Windows凭据连接到服务器。如果您登录到可以访问相关数据的Windows计算机,则这些工作正常。在Linux上运行是一个不同的故事,所以我保持用户/密码组合。

随时可以提出问题。