Informix、pyodbc、Centos

Posted

技术标签:

【中文标题】Informix、pyodbc、Centos【英文标题】:Informix, pyodbc, Centos 【发布时间】:2017-03-21 17:11:04 【问题描述】:

我正在尝试通过 Informix 连接我的工作数据库以创建脚本,但我在连接中遇到问题。

错误是:

 Traceback (most recent call last):
  File "./Test1.py", line 11, in <module>
    con = pyodbc.connect(constr, autocommit=False)
pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib '/opt/IBM/informix/lib/cli/iclit09b.so' : file not found (0) (SQLDriverConnectW)")

但其实我机器上有这个文件,所以我用ldd,发现真正的错误是库libifgls.solibifglx.so没有找到:

[jordaz@localhost scripts]$ ldd /opt/IBM/informix/lib/cli/iclit09b.so
        linux-gate.so.1 =>  (0xf777f000)
        libifgls.so => not found
        libifglx.so => not found
        libpthread.so.0 => /lib/libpthread.so.0 (0xf75db000)
        libc.so.6 => /lib/libc.so.6 (0xf741d000)
        libm.so.6 => /lib/libm.so.6 (0xf73d9000)
        libdl.so.2 => /lib/libdl.so.2 (0xf73d4000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0xf73a4000)
        /lib/ld-linux.so.2 (0xf7780000)
        libfreebl3.so => /lib/libfreebl3.so (0xf73a0000)

还有我的 /etc/odbcinst.ini

[cms]
Description           = mysql connection to 'Kkapd' database
Driver                = MySQL
Database              = cms
Server                = 10.177.3.100
Port                  = 50005
Socket                = /var/lib/mysql/mysql.sock

[Informix]
Description           =Informix Driver
Driver                =/opt/IBM/informix/lib/cli/iclit09b.so
APILevel              =1
ConnectFunctions      =YYY
DriverODBCVer         =03.00
FileUsage             =0
SQLLevel              =1
smProcessPerConnect   =Y

还有我的 /etc/odbc.ini

[cms]
Description           = MySQL connection to 'Kkapd' database
Driver                = MySQL
Database              = cms
Server                = 10.177.3.100
Port                  = 50005
Socket                = /var/lib/mysql/mysql.sock

[Informix]
Description           =Informix Driver
Driver                =/opt/IBM/informix/lib/cli/iclit09b.so
APILevel              =1
ConnectFunctions      =YYY
DriverODBCVer         =03.00
FileUsage             =0
SQLLevel              =1
smProcessPerConnect   =Y

我该如何解决这个问题,以便我可以正确连接?

我更新了 PATHS,所以我用 ldd 进行了双重检查,但问题是我得到了文件但仍然是同样的错误:

[informix@localhost scripts]$ ldd /opt/IBM/informix/lib/cli/iclis09b.so
        linux-gate.so.1 =>  (0xf7786000)
        libifgls.so => /opt/IBM/informix/lib/esql/libifgls.so (0xf75c1000)
        libifglx.so => /opt/IBM/informix/lib/esql/libifglx.so (0xf75bf000)
        libc.so.6 => /lib/libc.so.6 (0xf73f8000)
        libm.so.6 => /lib/libm.so.6 (0xf73b4000)
        libdl.so.2 => /lib/libdl.so.2 (0xf73af000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0xf737f000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xf7364000)
        /lib/ld-linux.so.2 (0xf7787000)
        libfreebl3.so => /lib/libfreebl3.so (0xf7360000)

我在安装 Informix 时实际上更改了 /etc/ld.so.conf这个文件:

include ld.so.conf.d/*.conf
/home/informix/lib/cli
/home/informix/lib/esql
/home/informix/lib
export INFORMIXDIR=/home/informix
export PATH=$INFORMIXDIR/bin:$PATH
export LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/cli:$INFORMIXDIR/lib/esql:$LD_LIBRARY_PATH
export TERMCAP=$INFORMIXDIR/etc/termcap
export TERM=vt100
export DBDATE=DMY4/
export DBCENTURY=C
export DBEDIT=nano
export VISUAL=nano
export INFORMIXSERVER=cms_net
export ONCONFIG=onconfig.cms
export INFORMIXSQLHOSTS=/home/informix/etc/sqlhosts
export ODBCINI=/etc/odbc.ini

【问题讨论】:

看来您需要设置LD_LIBRARY_PATH 或配置/etc/ld.so.conf 以便自动搜索/opt/IBM/informix/lib/opt/IBM/informix/lib/esql 以查找共享库,以便libifgls.solibifglx.so 是也发现了。使用ldd 是发现未找到内容的好方法。更改配置后,您可以通过 ldd 仔细检查。 你是如何设置LD_LIBRARY_PATH,或者你改变了/etc/ld.so.conf?我不知道Changing LD_LIBRARY_PATH at runtime for ctypes 是否提供任何见解。 @JonathanLeffler 我添加了我的文件的副本,我认为它是正确的 【参考方案1】:

终于我可以解决这个问题了,错误是我在 Informix 上有一个旧版本,所以我重新安装了另一个版本,以便我的驱动程序可以工作,所以也许这对某人有帮助!

【讨论】:

以上是关于Informix、pyodbc、Centos的主要内容,如果未能解决你的问题,请参考以下文章

Informix“加载”命令在 Python pyodbc 中不起作用

通过 Python 连接到 UCCX 数据库 (Informix)

使用 django 连接到旧版 informix 数据库

作为服务运行时未找到 ODBC Lib

Django 1.11.7+django_pyodbc_azure-1.11.0.0+pyodbc 连接mssql 数据库

pymysql vs. pyodbc - pymysql 是 slooooooooooooow