Python 在macosx上使用pyodbc的DB2
我正试图在MacOSX上使用pyodbc连接到DB2数据库,但似乎无法实现。在类似条件下,我成功地使用FreeTDS连接到MS SQL Server 首先,我从IBM安装了db2exc_client_952_MAC_x86_64。成功安装之后,我通过ODBC管理员添加了驱动程序 然后我试着运行这个python:Python 在macosx上使用pyodbc的DB2,python,macos,db2,pyodbc,Python,Macos,Db2,Pyodbc,我正试图在MacOSX上使用pyodbc连接到DB2数据库,但似乎无法实现。在类似条件下,我成功地使用FreeTDS连接到MS SQL Server 首先,我从IBM安装了db2exc_client_952_MAC_x86_64。成功安装之后,我通过ODBC管理员添加了驱动程序 然后我试着运行这个python: import pyodbc cnxn = pyodbc.connect('Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port
import pyodbc
cnxn = pyodbc.connect('Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;');
我收到这个错误:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
pyodbc.Error:('HY000','[]X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8 8\X8 8\X8\X8\X8 8\X8\X8\X8 8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\8\8\X8\X8\X8\X8\X8\X8\8\8\X8\X8\X8\X8\X8\X8\8\8\X8\X8\X8\X8\8\8\X8\8\8\8 x93\xa0\x80\xb4\xf8\x88\x80\x80\xf8\x88\x80\x81\x81\xf8\x98\x90\x81\xa4\x08\x98\x90\x81\x84\x08\x98\x90\x90\x90\x90\x90\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x90\x90\x90\x90\X10\X10\X10\X10\X10\X10\X8\X8\X8\X8\X8\X8\X0\X0\X8\X0\X8\X8\X8\X0\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X0\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\Xx80\xa0\xf8\x9a\x90\x81\xb8\xf8\x9d\x80\x81\xb3\xf8\x88\x80\x80\xae\xf8\x94\xb0\x80\xa0\xf8\x93\x80\x81\x91\x91\x91\XX8\X8\X8\X9\X9\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X9\X8\X8\X9\X8\X9\X8\X8\X8\X9\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8\X8 \ \ \ \xa2\x80\xb2\xfd\x96\x93\x92\x81\xb2\xfd\x93\x82\xa2\xb9\x93\xff\x7f(-1024)(SQLDriverConnect)'))
我从搜索中得出结论,HY000可能是一个连接字符串问题,但我不确定如何破译其余的错误
有什么想法吗?连接字符串似乎因数据库而异,并且您使用的连接字符串与DB2不兼容 下面是一些DB2连接字符串示例: 以下是关于DB2连接字符串中有效内容的最佳参考: 基于此,我将您的连接字符串转换为:
Driver={IBM DB2 ODBC Driver}; Hostname=myhost.com; Port=50300; Protocol=TCPIP; Database=DB2ET; CurrentSchema=SCHM1; UID=MYUID; PWD=MYPWD;
致:
下面是我的连接字符串在PHP中的外观(我知道您使用的是Python,但我认为它们非常相似): 注意,我说的是“SYSTEM=…”,而你说的是“Hostname=…”——我认为这可能很重要 您的DSN是否已完全设置?在我的Linux机器上,我有两个文件,其中包含DSN的所有配置信息 odbc.ini
[primary]
Description = primary
Driver = iSeries Access ODBC Driver
System = xxx.xxx.xxx.xxx
UserID = xxxxxxxxxx
Password = xxxxxxxxxx
Naming = 0
DefaultLibraries = QGPL
Database = xxxxxxxxxx
ConnectionType = 0
CommitMode = 2
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 1
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0
和odbcinst.ini
[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /usr/lib/libcwbodbc.so
Setup = /usr/lib/libcwbodbcs.so
NOTE1 = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2 = the following Driver64/Setup64 keywords will provide that support.
Driver64 = /usr/lib/lib64/libcwbodbc.so
Setup64 = /usr/lib/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1
UsageCount = 1
我相信您在显示的对话框中输入了类似的信息,可能在DSN选项卡下
是否启用了ODBC跟踪?要在Linux中执行此操作,我必须将其添加到odbcinst.ini文件中:
[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log
这为我提供了很多信息,有助于诊断我过去遇到的一些问题
根据这一页(http://code.google.com/p/pyodbc/wiki/ConnectionStrings),“需要知道的最重要的事情是pyodbc甚至不查看连接字符串——它未经修改直接传递给SqlDriverConnection。”如果这是真的,那么将“主机名”更改为“系统”就可以了
编辑
这可能是编码问题吗?Unicode试图与UTF-8服务器(或类似服务器)通信?您是否尝试过设置CCSID?配置驱动程序时,是否有诸如“BinAsChar”、“CCSID”或“主机CCSID”之类的选项
默认情况下,我认为CCSID是37(美国/加拿大),Unicode是1208。为什么不使用驱动程序定义用户DSN,然后在connect()方法中使用DSN 顺便说一句,使用除“iSeries Access ODBC驱动程序”之外的任何驱动程序都可能导致DB2许可错误。也许这就是信息所说的
该驱动程序是在您安装“IBM i Access for Windows 7.1”时安装的。谢谢您的建议,但在更改该连接字符串后,我仍然看到相同的乱码错误。我已经尝试了10多种连接字符串,到目前为止没有一种有效。我原来帖子中的那个实际上是一个可以在Windows.Hhmmm上运行的。此链接表示HY000表示它希望提示对话框,因为连接字符串中的信息不足。数据库服务器上是否设置了某种策略,不允许在连接字符串中内联UID和PWD?您是否尝试了一个没有UID和PWD的连接字符串,只是为了看看会发生什么?对于这个问题,没有数据库和CurrentSchema?你找到这个了吗?我在ODBC管理员中设置ODBC驱动程序时遇到问题。@cabe56不,不幸的是,我没有弄明白这一点。我的下一个想法是使用类似的东西,因为我可以在Mac上使用DbVisualizer访问DB2 fine(我相信它在幕后使用JAVA)
[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /usr/lib/libcwbodbc.so
Setup = /usr/lib/libcwbodbcs.so
NOTE1 = If using unixODBC 2.2.11 or later and you want the 32 and 64-bit ODBC drivers to share DSN's,
NOTE2 = the following Driver64/Setup64 keywords will provide that support.
Driver64 = /usr/lib/lib64/libcwbodbc.so
Setup64 = /usr/lib/lib64/libcwbodbcs.so
Threading = 2
DontDLClose = 1
UsageCount = 1
[ODBC]
Trace = Yes
TraceFile = /tmp/odbc.log
pyodbc.connect( 'DSN=MYDSN;UID=MYUSER;PWD=MYPASS' )