在Windows上使用pyodbc连接到Informix

时间:2014-10-07 04:52:12

标签: python windows odbc informix pyodbc

我试图在python中编写一个需要在不同数据库环境之间移植的进程。它必须能够连接的环境之一是Informix。

我一直在寻找如何在Python中连接到Informix,并且遇到了InformixDB和ibm_db {,_ sa},这两者似乎都太难用了(而且我已经尝试过但是我不能让他们工作)。

我正在尝试(再次)使用pyodbc,但无法从Windows建立与数据库的连接:

set INFORMIXDIR="C:\Program Files\IBM Informix Client SDK"
set CLIENT_LOCALE=en_US.CP1252
set DB_LOCALE=en_US.819

python
Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:18:40) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pyodbc
>>>
>>> cnxn = pyodbc.connect(dsn='devdb')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('HY000', '[HY000] [Informix][Informix ODBC Driver][Informix]Unspecified System Error = -23101. (-23101) (SQLDriverConnect)')

根据我的发现,错误-23101 是由于Locale无法正确匹配导致的,但这些值与ODBC配置中使用的值相同,以及任何其他与Informix相关的实用程序我随心所欲。

我无法弄清楚如何连接到Informix,并且无法想到用于尝试找出此问题的更多搜索词。如何使用ODBC如此困难 - 我所知道的几乎所有其他语言都没有问题!

注意:为了清楚起见,ODBC连接已正确配置并与其他基于ODBC的应用程序一起使用(我可以使用QTODBC或Perl DBI进行连接)。

提前感谢您的帮助。

修改:嘿,我还没有足够的信誉来附加图片,但如果你想看一下,我已经在http://wraeth.id.au/wp-content/uploads/2014/10/odbcad32.png上传了它。

编辑2

  • 更新为ActivePython-3.3.4,无需更改
  • 创建指向IFX ClientSDK目录的符号链接以删除路径中的空格,从而导致“驱动程序未提供错误”
  • 通过检查数据库中的DB_LOCALE表确认en_US.819sysdbslocale

另外,确认%INFORMIXDIR%设置为有效的CSDK安装:

> mklink /D informix "C:\Program Files\IBM Informix Client SDK"
> set INFORMIXDIR=C:\informix
> dir %INFORMIXDIR%\gls
 Volume in drive C has no label
 Volume Serial Number is 808D-98FF

 Directory of C:\informix\gls

19/09/2013  04:50 PM    <DIR>          .
19/09/2013  04:50 PM    <DIR>          ..
19/09/2013  04:50 PM    <DIR>          cm3
19/09/2013  04:50 PM    <DIR>          cv9
19/09/2013  04:50 PM    <DIR>          dll
19/09/2013  04:50 PM    <DIR>          etc
19/09/2013  04:50 PM    <DIR>          lc11

使用符号链接INFORMIXDIR仍然不允许它连接:

ActivePython 3.3.4.1 (ActiveState Software Inc.) based on
Python 3.3.4 (default, Feb 25 2014, 15:11:05) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, pyodbc
>>> os.path.exists(
...   os.path.join(
...     os.environ.get('INFORMIXDIR'),
...     'gls'
...   )
... )
True
>>> cnxn = pyodbc.connect(dsn='devdb', uid='user', pwd='password')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.Error: ('HY000', 'The driver did not supply an error!')


解决方案

将Client SDK卸载并重新安装到没有空格(C:\informix)的路径似乎解决了这个问题。

1 个答案:

答案 0 :(得分:4)

应该是评论,但是太长了。

虽然我无法重现您的错误但我有一些想法。

  1. 重新安装ClientSDK并将其安装在c:\informix目录中,并将其设置为%INFORMIXDIR%。这应该更改有关驱动程序的ODBC注册表项:

    [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\IBM INFORMIX ODBC DRIVER]
    "Driver"="C:\\informix\\bin\\iclit09b.dll"
    "Setup"="C:\\informix\\bin\\iclit09b.dll"
    

    关于数据库(devdb是我的DSN)

    [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\devdb]
    "Driver"="C:\\informix\\bin\\iclit09b.dll"
    

    (这些条目来自32位Windows)

    我在阅读答案和评论之后建议:Informix connection works through Windows, but not through Cygwin

  2. 如果你有ActiveState Python,那么你可以使用odbc模块而不是pyodbc。是win32包的一部分,仅适用于Windows,但它可以与您的数据库连接。您可以使用以下命令打开数据库:

    import odbc
    cnxn = odbc.odbc('devdb/user/password')
    
  3. 如果某些ODBC软件有效,则可以启用跟踪ODBC并比较跟踪。如果您可以从odbc模块而不是pyodbc进行连接,那将非常有用。