- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试用 Python 与 AS400 对话。目标是使用 SQLAlchemy,但当我无法让它工作时,我退回到更基本的脚本,只使用 ibm_db 而不是 ibm_db_sa。
import ibm_db
dbConnection = ibm_db.pconnect("DATABASE=myLibrary;HOSTNAME=1.2.3.4;PORT=8471;PROTOCOL=TCPIP;UID=username;PWD=password", "", "") #this line is where it hangs
print ibm_db.conn_errormsg()
问题似乎出在端口上。如果我使用在所有示例中看到的 50000,我会收到错误消息。如果我使用 446,则会出现错误。令人困惑的部分是:如果我使用 8471,这 IBM says to do ,我没有收到任何错误,没有超时,没有任何回应。我让脚本运行了 20 多分钟,它只是坐在那里,什么也不做。它处于事件状态,因为我根本无法使用命令提示符,但它从不给我任何类型的反馈。
我每天工作的公司都使用同一个 400,用于日志记录、电子邮件和(大量)数据库使用,所以我知道它有效。我们使用的软件在后台与数据库对话,在我的机器上运行良好。这告诉我我的驱动程序是好的,网络设置是正确的,等等。我什至可以从这里远程登录到 400。
我在 SQLAlchemy 和 ibm_db 电子邮件列表中,并且已经就此问题与他们沟通了好几天。我也用谷歌搜索了这么多,以至于我的搜索结果中已经没有未访问过的链接了。似乎没有人遇到连接无限期挂起的问题。如果有什么我可以在 Python 中尝试的,我会尝试的。我不直接处理 400,但我可以请负责检查/配置我需要的任何东西的人。正如我所说,多个工作站可以毫无问题地与 400 的数据库对话,并且如果从 400 本身运行,对我想访问的库运行的查询工作正常。如果有人有任何建议,我将不胜感激。谢谢!
最佳答案
README for ibm_db_sa
仅在“支持的数据库”部分列出 DB2 for Linux/Unix/Windows。所以它很可能不适用于 DB2 for i,至少不是开箱即用。
既然您已经声明您拥有适用于 Windows 的 IBM System i Access,我强烈建议您只使用它附带的驱动程序之一(ODBC、OLEDB 或 ADO.NET,如@Charles 所述)。
就个人而言,我总是使用 ODBC,使用 pyodbc
或 pypyodbc
.任何一个都可以正常工作。一个简单的例子:
import pyodbc
connection = pyodbc.connect(
driver='{iSeries Access ODBC Driver}',
system='11.22.33.44',
uid='username',
pwd='password')
c1 = connection.cursor()
c1.execute('select * from qsys2.sysschemas')
for row in c1:
print row
现在,SQLAlchemy 的连接方法之一是 pyodbc
,所以我认为,如果您可以直接使用 pyodbc
建立连接,则可以通过某种方式配置 SQLAlchemy 来执行相同的。但我自己不是 SQLAlchemy 用户,所以我没有相关的示例代码。
更新
我设法让 SQLAlchemy 连接到我们的 IBM i 并直接执行 SQL 查询。换句话说,使其具有与直接使用 PyODBC 大致相同的功能。 我还没有测试任何其他 SQLAlchemy 功能。我在 Windows 7 机器上设置连接时所做的:
安装 ibm_db_sa
作为 SQLAlchemy 方言
您也许可以为此使用 pip
,但我使用的是低技术含量的方法:
ibm_db_sa
来自 PyPI。ibm_db_sa-0.3.2.tar.gz
) 并将随附的 ibm_db_sa
目录复制到 sqlalchemy\dialects
目录中.修改sqlalchemy\dialects\ibm_db_sa\pyodbc.py
initialize()
方法添加到AS400Dialect_pyodbc
类DB2Dialect
中的同名方法,AS400Dialect_pyodbc
继承自该方法。问题是 DB2Dialect.initialize()
尝试设置属性 dbms_ver
和 dbms_name
,当连接到 IBM i 时,这两个属性都不可用或不相关使用 PyODBC(据我所知)。dialect
并将其设置到AS400Dialect_pyodbc
类上述修改的代码应该放在文件的末尾,如下所示:
def initialize(self, connection):
super(DB2Dialect, self).initialize(connection)
dialect = AS400Dialect_pyodbc
注意缩进!请记住,initialize()
方法需要属于 AS400Dialect_pyodbc
类,并且 dialect
需要是模块的全局代码。
最后,您需要为引擎创建者提供正确的 URL:
'ibm_db_sa+pyodbc://username:password@host/*local'
(显然,用有效值替换 username
、password
和 host
。)
就是这样。此时,您应该能够创建引擎、连接到 i 并通过 SQLAlchemy 执行纯 SQL。我想很多 ORM 的东西在这一点上也应该工作,但我还没有验证这一点。
关于python - 连接到 IBM AS400 服务器进行数据库操作挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461388/
我是一名优秀的程序员,十分优秀!