在 Windows 上使用 pyodbc 连接到 Informix

Posted

技术标签:

【中文标题】在 Windows 上使用 pyodbc 连接到 Informix【英文标题】:Connecting to Informix with pyodbc on Windows 【发布时间】:2014-10-07 04:52:12 【问题描述】:

我正在尝试在 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 是由区域设置不正确匹配引起的,但是这些值与 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 目录的符号链接以删除路径中的空格,导致“驱动程序未提供错误” 通过检查数据库中的sysdbslocale 表确认DB_LOCALEen_US.819

另外,确认 %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) 似乎已经解决了这个问题。

【问题讨论】:

我使用 ActivePython 3.3.4 和 pyodbc 模块和 Informix Client 4.10.TC4DE。它很简单。您的CLIENT_LOCALEDB_LOCALE 是否与 ODBC 驱动程序设置对话框的环境选项卡上的相同?你能给我们看一下这个对话框的截图吗? 也尝试在不设置任何 Informix *_LOCALE 环境变量的情况下运行您的程序。当我设置你的值(而不是我通常使用的波兰语pl_pl.CP1250)时,我得到了和你一样的错误。然后我清除了那些环境变量,我就可以连接服务器了。 @MichałNiklas 我正在使用香草 Python-3.3.3 和客户端 4.10TC1。我现在不在机器旁(远程获取信息),明天将尝试安装/使用 ActivePython。我将很快附上屏幕截图,但 CLIENT_LOCALE 和 DB_LOCALE 的设置与 ODBC 配置对话框中的设置相同;当我取消设置变量(或从干净的​​命令提示符开始)时,也会出现相同的结果。 您还可以连接到sysmaster 数据库并使用select * from sysdbslocale; 检查数据库的区域设置 INFORMIXDIR 也可能有问题。这是正确的吗?是否存在%INFORMIXDIR%\gls 【参考方案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

    如果您有 ActiveState Python,那么您可以使用 odbc 模块而不是 pyodbc。 Is 是 win32 软件包的一部分,仅适用于 Windows,但它可能可以连接到您的数据库。您可以使用以下方式打开数据库:

    import odbc
    cnxn = odbc.odbc('devdb/user/password')
    

    如果某些 ODBC 软件有效,那么您可以启用跟踪 ODBC 并比较跟踪。如果您可以从 odbc 模块连接但不能从 pyodbc 连接,这将非常有用。

【讨论】:

看来完全重新安装 CSDK 解决了这个问题。我猜想,即使指定 INFORMIXDIR 允许您在没有空格的情况下寻址路径,它在内部使用完整的“真实”路径(并且,作为基于 UNIX 的软件,使用空格中断)。谢谢! 我会赞成你的回答,但我还不够特别 :) 谢谢!

以上是关于在 Windows 上使用 pyodbc 连接到 Informix的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqlalchemy 和 pyodbc 连接到 SQL Server 2012

使用 pyodbc 从 Linux 向 Windows SQL Server 进行身份验证

尝试使用pyodbc将python连接到Access数据库时出错[重复]

如何在 python 中使用 pyodbc 连接到本地优势数据库?

使用 pyODBC 连接到 ODBC

使用Python通过Windows身份验证连接到MS SQL Server?