如何让 Python 和 Informix 在 Linux 上通话?

How do I get Python and Informix talking on Linux?

我在这方面已经有一段时间了,尝试了来自 openSource、IBM 和许多其他公司的各种不同包。我还没有找到一个没有某种我无法工作的令人困惑的安装方法,或者与我似乎无法工作的其他第三方部件的某种集成的工作方式。

我只是尝试使用 Python 在 Informix Server 上执行 SQL 语句。与 mySQL 和其他工具没有什么不同。使用游标或完整结果转储,真的不在乎。我希望能够静态或动态地形式化查询字符串,然后告诉任何 tools/module 执行所述查询和 return 结果(如果有)。

我试过:

我管理的内容:

我只是被难住了。寻求有关下载内容(URL)、如何安装(提示和技巧、环境变量、安装位置等)的帮助。我想要一些不依赖于 Java 或编写 Java 等。我正在寻找一种解决方案,它可能使我能够编写 Python 以从 Informix 数据库和表中查询、插入、更新和删除。我想把我以前写的 Java 和 Bash 脚本合并成一个 Python 脚本。

感到沮丧并寻求任何帮助。

感谢您的聆听,如果您不明白我的请求,请提出问题。

Linux 上的 Informix 令人头疼。为了使 Informix-connect 与 CPython3 一起工作,我的个人设置是将 Informix Client SDK 与 unixODBC 和 pyodbc 堆叠在一起。有一些障碍需要跳过,其中 none 已记录在案。几乎所有的设置都是完全无用的,但需要防止 Informix 驱动程序的某些部分退出。请注意,某些选项区分大小写和 space(Description=Informix != description = Informix)。


  • 安装 Informix 客户端 SDK。您不需要包中的所有垃圾,只需要 Informix Connect。我假设您使用默认路径 /opt/IBM/informix
  • /opt/IBM/informix/lib/cli/opt/IBM/informix/lib/esql 添加到您的动态链接器查找路径。在 Fedora 上,您可以通过将它们放入一个新文件 /etc/ld.so.conf.d/informix.conf
  • 来完成此操作
  • 创建一个新的 /etc/odbc.ini 并添加以下内容:

    [ODBC Data Sources] Infdrv1=IBM INFORMIX ODBC DRIVER [Infdrv1] Driver=/opt/IBM/informix/lib/cli/iclit09b.so Description=Informix Database=WHATEVER_YOUR_DB_NAME_IS Servername=WHATEVER_YOUR_SERVER_NAME_IS CLIENT_LOCALE=en_us.8859-1 # MAY BE DIFFERENT DB_LOCALE=en_us.819 # MAY BE DIFFERENT [ODBC] UNICODE=UCS-2

  • 新建一个/etc/odbcinst.ini并添加以下内容

    [IBM INFORMIX ODBC DRIVER] Description=Informix Driver Driver=libifcli.so

  • 您需要设置环境变量INFORMIXDIRODBCINI。在 Fedora 上,您可以添加一个新文件 /etc/profile.d/informix.sh 并添加

    export INFORMIXDIR=/opt/IBM/informix export ODBCINI=/etc/odbc.ini

  • 编辑 /opt/IBM/informix/etc/sqlhosts 并将您的基本连接信息放在那里。在最简单的情况下,它只有一行

    YOUR_SERVER_NAME\tonsoctcp\tYOUR_DB_NAME\tpdap-np

    请注意,pdap-np 实际上是端口 1526,它也是 Informix "Turbo"-Driver tcp 端口。查看您的 /etc/services

  • 在您的 $HOME 中创建一个空的 .odbc.ini,例如通过 touch $HOME/.odbc.ini。它需要在那里。它需要为 0 字节。我喜欢这部分。

  • 从您喜欢的存储库安装 unixODBC 和 pyodbc。


记得让你的 env-changes 继续,例如通过重启。您现在可以像这样连接:

import pyodbc
DRIVER = 'IBM INFORMIX ODBC DRIVER'
SERVER = 'YOUR_SERVER_NAME' 
DATABASE = 'YOUR_DB_NAME'
constr = 'DRIVER={%s};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (DRIVER, SERVER, DATABASE, USER, PASS)
con = pyodbc.connect(constr, autocommit=False)

从那里您可以获取光标、执行查询、获取结果等。请注意,IBM 的 ODBC 驱动程序中有许多奇怪的错误,超出我的想象:

  • 包含 NULLs 的行可能会导致段错误,因为 IBM 驱动程序将 32 位 int 放置在 64 位 int 预期表示值为 null 的位置。如果您受此影响,您需要为所有可能的列类型修补 unixODBC 以处理此问题。
  • 没有名称的列会导致驱动程序出现段错误(例如 SELECT COUNT(*) FROM foobar 需要 SELECT COUNT(*) AS c FROM foobar)。
  • 确保您的编码确实按预期工作。 UTF8 对 IBM 来说不够企业级,而 UCS-2 是我唯一需要工作的东西。