如何让Python和Informix在Linux上交谈?

时间:2015-10-01 21:35:36

标签: python informix

我已经参与了一段时间,尝试了各种不同的软件包,包括openSource,IBM和其他许多软件包。我还没有找到一个没有某种令人困惑的安装方法而无法工作的方法,或者某种与其他第三方产品集成的工作,我似乎无法工作。

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

我试过了:

我管理的内容:

  • 我已经能够安装并安装并运行IBM Informix Client SDK。我可以连接到我的Informix数据库服务器并执行查询。
  • 我有mySQL工作,连接和查询。
  • 我编写了一个Java程序,使用Java驱动程序执行查询,编译它,将其与bash脚本相结合,以执行查询和电子邮件结果。

我很难过。寻求有关下载内容(URL),如何安装(提示和技巧,环境变量,安装位置等)的帮助。我希望有一些不依赖于Java或编写Java等的东西我正在寻找一种解决方案,可以让我能够编写Python来从Informix数据库和表中查询,插入,更新和删除。我想将以前编写的Java和Bash脚本合并到P​​ython脚本中。

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

感谢您的倾听,如果您不理解我的请求,请提出问题。

1 个答案:

答案 0 :(得分:1)

Linux上的Informix是一堆痛苦。我使用Informix-connect与CPython3一起工作的个人设置是将Informix Client SDK与unixODBC和pyodbc堆叠在一起。有一些箍要跳过,没有一个记录。几乎所有的设置都是完全无用的,但需要防止Informix驱动程序的某些部分纾困。请注意,某些选项区分大小写和空格(Description=Informix!= description = Informix)。

  • 安装Informix Client 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

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

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

请记住让您的环境变化,例如通过重启。您现在可以像这样连接:

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驱动程序中存在许多怪癖,我不知道:

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