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

如何让Python和Informix在Linux上对话?,python,informix,Python,Informix,我在这方面已经有一段时间了,尝试了来自开源、IBM和其他许多公司的各种不同的软件包。我还没有找到一个可以在没有某种令人困惑的安装方法的情况下工作的,我无法使用的,或者与其他第三方部件集成的,我似乎无法使用的 我只是尝试使用Python在Informix服务器上执行SQL语句。与mySQL和其他工具没有什么不同。使用游标或完整结果转储,真的不在乎。我希望能够静态或动态地形式化查询字符串,然后告诉任何工具/模块执行所述查询并返回结果(如果有的话) 我试过: ibm_db 2.0.5.1() IBM

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

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

我试过:

  • ibm_db 2.0.5.1()
  • IBM Informix客户端SDK
  • pymssql
  • unixODBC
  • 看了但是不想用Jython(Jython)
我所管理的:

  • 我已经能够安装IBMInformix客户端SDK并使其正常工作。我可以连接到Informix DB服务器并执行查询
  • 我有mySQL工作、连接和查询
  • 我编写了一个Java程序,使用Java驱动程序执行查询,对其进行编译,并将其与bash脚本相结合,以执行查询和发送电子邮件结果
我只是被难住了。寻找关于下载内容(URL)、如何安装(提示和技巧、环境变量、安装位置等)的帮助。我想要不依赖Java或编写Java等的东西。我正在寻找一个解决方案,该解决方案可能会让我能够编写Python来查询、插入、更新、,并从Informix数据库和表中删除。我想将以前编写的Java和Bash脚本组合成Python脚本

感到沮丧并寻求任何帮助


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

Linux上的Informix是一个痛苦的包袱。让Informix connect与CPython3协同工作的个人设置是将Informix客户端SDK与unixODBC和pyodbc堆叠在一起。有一些环跳通过,其中没有记录。几乎所有的设置都是完全无用的,但需要防止Informix驱动程序的某些部分退出。请注意,有些选项区分大小写和空格(
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数据源]
    Infdrv1=IBM INFORMIX ODBC驱动程序
    [Infdrv1]
    Driver=/opt/IBM/informix/lib/cli/iclit09b.so
    Description=Informix
    数据库=无论你的名字是什么
    服务器名称=无论您的服务器名称是什么
    CLIENT_LOCALE=en_us.8859-1#可能不同
    DB_LOCALE=en_us.819#可能不同
    [ODBC]
    UNICODE=UCS-2

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

    [IBM INFORMIX ODBC驱动程序]
    Description=Informix驱动程序
    Driver=libifcli.so

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

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

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

    YOUR_SERVER_NAME\tonsoctcp\tYOUR_DB_NAME\tpdap np

    请注意,
    pdapnp
    实际上是端口1526,它也是Informix“Turbo”驱动程序tcp端口。查看您的
    /etc/services

  • $HOME
    中创建一个空的
    .odbc.ini
    ,例如通过
    触摸$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驱动程序中有许多奇怪的bug,我想不出来:

  • 包含
    NULL
    s的行可能会导致segfault,因为IBM驱动程序将32位int放入其中,其中64位int将表示值为NULL。如果受此影响,您需要为所有可能的列类型修补unixODBC以处理此问题
  • 没有名称的列会导致驱动程序segfault(例如,从foobar中选择计数(*)需要是从foobar中选择计数(*)作为c
  • 确保您的编码实际按照预期工作。UTF8对于IBM来说还不够企业化,而UCS-2是我唯一要做的事情
感谢您的回复!我不确定有多少人在使用这个组合,因为它并没有产生一大堆流量。等我回到办公室,我会试试你的建议。我非常感谢您的帮助。如果您已经安装了CSDK(并正在连接),IfxPy应该是直接的。我也去过那里。最终为Jython解决了。