如何让 Python 和 Informix 在 Linux 上通话?
How do I get Python and Informix talking on Linux?
我在这方面已经有一段时间了,尝试了来自 openSource、IBM 和许多其他公司的各种不同包。我还没有找到一个没有某种我无法工作的令人困惑的安装方法,或者与我似乎无法工作的其他第三方部件的某种集成的工作方式。
我只是尝试使用 Python 在 Informix Server 上执行 SQL 语句。与 mySQL 和其他工具没有什么不同。使用游标或完整结果转储,真的不在乎。我希望能够静态或动态地形式化查询字符串,然后告诉任何 tools/module 执行所述查询和 return 结果(如果有)。
我试过:
- ibm_db 2.0.5.1 (https://pypi.python.org/pypi/ibm_db)
- IBM Informix 客户端 SDK
- pymssql
- unixODBC
- 看过但不想用Jython (JPython)。
我管理的内容:
- 我已经能够安装并运行 IBM Informix Client SDK。我可以连接到我的 Informix DB 服务器并执行查询。
- 我有 mySQL 工作、连接和查询。
- 我编写了一个 Java 程序来使用 Java 驱动程序执行查询,编译它,将它与 bash 脚本结合以执行查询和电子邮件结果。
我只是被难住了。寻求有关下载内容(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
您需要设置环境变量INFORMIXDIR
和ODBCINI
。在 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 驱动程序中有许多奇怪的错误,超出我的想象:
- 包含
NULL
s 的行可能会导致段错误,因为 IBM 驱动程序将 32 位 int 放置在 64 位 int 预期表示值为 null 的位置。如果您受此影响,您需要为所有可能的列类型修补 unixODBC 以处理此问题。
- 没有名称的列会导致驱动程序出现段错误(例如
SELECT COUNT(*) FROM foobar
需要 SELECT COUNT(*) AS c FROM foobar
)。
- 确保您的编码确实按预期工作。 UTF8 对 IBM 来说不够企业级,而 UCS-2 是我唯一需要工作的东西。
我在这方面已经有一段时间了,尝试了来自 openSource、IBM 和许多其他公司的各种不同包。我还没有找到一个没有某种我无法工作的令人困惑的安装方法,或者与我似乎无法工作的其他第三方部件的某种集成的工作方式。
我只是尝试使用 Python 在 Informix Server 上执行 SQL 语句。与 mySQL 和其他工具没有什么不同。使用游标或完整结果转储,真的不在乎。我希望能够静态或动态地形式化查询字符串,然后告诉任何 tools/module 执行所述查询和 return 结果(如果有)。
我试过:
- ibm_db 2.0.5.1 (https://pypi.python.org/pypi/ibm_db)
- IBM Informix 客户端 SDK
- pymssql
- unixODBC
- 看过但不想用Jython (JPython)。
我管理的内容:
- 我已经能够安装并运行 IBM Informix Client SDK。我可以连接到我的 Informix DB 服务器并执行查询。
- 我有 mySQL 工作、连接和查询。
- 我编写了一个 Java 程序来使用 Java 驱动程序执行查询,编译它,将它与 bash 脚本结合以执行查询和电子邮件结果。
我只是被难住了。寻求有关下载内容(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
您需要设置环境变量
INFORMIXDIR
和ODBCINI
。在 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 驱动程序中有许多奇怪的错误,超出我的想象:
- 包含
NULL
s 的行可能会导致段错误,因为 IBM 驱动程序将 32 位 int 放置在 64 位 int 预期表示值为 null 的位置。如果您受此影响,您需要为所有可能的列类型修补 unixODBC 以处理此问题。 - 没有名称的列会导致驱动程序出现段错误(例如
SELECT COUNT(*) FROM foobar
需要SELECT COUNT(*) AS c FROM foobar
)。 - 确保您的编码确实按预期工作。 UTF8 对 IBM 来说不够企业级,而 UCS-2 是我唯一需要工作的东西。