我试图在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 :
DB_LOCALE
表确认en_US.819
为sysdbslocale
。另外,确认%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
)的路径似乎解决了这个问题。
答案 0 :(得分:4)
应该是评论,但是太长了。
虽然我无法重现您的错误但我有一些想法。
重新安装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
。是win32
包的一部分,仅适用于Windows,但它可以与您的数据库连接。您可以使用以下命令打开数据库:
import odbc
cnxn = odbc.odbc('devdb/user/password')
如果某些ODBC软件有效,则可以启用跟踪ODBC并比较跟踪。如果您可以从odbc
模块而不是pyodbc
进行连接,那将非常有用。