在 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_LOCALE
是en_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_LOCALE
和DB_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数据库时出错[重复]