gpt4 book ai didi

python - 连接到 IBM AS400 服务器进行数据库操作挂起

转载 作者:太空狗 更新时间:2023-10-29 18:28:44 25 4
gpt4 key购买 nike

我正在尝试用 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,使用 pyodbcpypyodbc .任何一个都可以正常工作。一个简单的例子:

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,但我使用的是低技术含量的方法:

    1. 下载ibm_db_sa来自 PyPI。
      在撰写本文时,最新版本为 0.3.2,于 2014 年 10 月 20 日上传。可以想象,以后的版本将以不同的方式修复或损坏(所以在未来,我将要描述的修改可能是不必要的,或者它们可能不起作用)。
    2. 解压缩归档文件 (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_verdbms_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'

(显然,用有效值替换 usernamepasswordhost。)

就是这样。此时,您应该能够创建引擎、连接到 i 并通过 SQLAlchemy 执行纯 SQL。我想很多 ORM 的东西在这一点上也应该工作,但我还没有验证这一点。

关于python - 连接到 IBM AS400 服务器进行数据库操作挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35461388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com