如何通过 ibm_db python 包连接到 DB2

问题描述 投票:0回答:1

我正在尝试通过 python 连接本地 DB2 数据库,但在过去几天没有成功。我希望社区能够帮助我解读错误消息并根据他们的经验提供帮助。

我的目标是在我的 Windows 7 笔记本电脑上安装 Python ibm_db 库并连接到我们的 DB2 实例

我无法使用 ibm_db.connect() 方法来识别已知良好的系统 DSN 或用户 DSN(我使用它们通过 Sql Server Management Studio (SSMS) 连接到 DB2)

我从各种连接组合中收到以下错误(如下所示),但我没有找到任何参考来说明这些错误的含义以及我可以采取哪些措施来解决该问题。我搜索并阅读了数十个IBM网站和文档,但没有一个提到这些信息。 --> 我有一种感觉,我错过了一些简单的步骤,但我不知道此时我不知道什么:)

系统配置注意事项::

  • Windows 7 笔记本电脑

  • DB2 版本 7.3

  • Python 2.7.13 |Anaconda 4.4.0(64 位)| (默认,2017 年 5 月 11 日,13:17:26)[MSC v.1500 64 位 (AMD64)] 在 win32 上

  • 安装的似乎相关的Python库版本

  • ibm-db (2.0.8)
  • ibm-db-sa (0.3.3)
  • pyodbc(4.0.16)
  • pyOpenSSL (17.0.0)

  • 我已安装并运行 iSeries Navigator,其中包括 iSeries ODBC 驱动程序。它可以完美地连接到本地 DB2 实例

  • 我安装了 DB2 命令行界面,它在注册表和 64 位 ODBC 管理器驱动程序列表中添加了一个名为 IBM DB2 ODBC DRIVER - C_clidriver 的驱动程序

  • 这是我从 iSeries ODBC 驱动程序创建的文件 DSN,它可以工作,但看起来与我用于 IBM CLI 驱动程序的 DSN 有很大不同:

    [ODBC] DRIVER=iSeries 访问 ODBC 驱动程序 数据库=数据库 PKG=QGPL/默认(IBM),2,0,1,0,512 语言 ID=ENU DFTPKGLIB=QGPL DBQ=QGPL 系统=DBSYS

第一次尝试:: 指定完整 DSN 的基本连接:

>>> import ibm_db
>>> dsn = "DATABASE=dbname;HOSTNAME=hostname.domain;PORT=466;PROTOCOL=TCPIP"
>>> conn = ibm_db.connect(dsn,'mytextuid','password')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: [IBM][CLI Driver] SQL10007N Message "0" could not be retrieved.  
  **Reason code: "6". SQLCODE=-1366**

下一步 :: 添加名称与注册表中的驱动程序名称完全相同的驱动程序

>>> dsn = "DRIVER={IBM DB2 ODBC DRIVER - C_clidriver};HOSTNAME=hostname.domain;PORT=446;PROTOCOL=TCPIP;UID=mytextuid;PWD=password;"
>>> conn = ibm_db.connect(dsn,'CROWLEY','July2017')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: [IBM][CLI Driver]  
  **SQLSTATE=01S00 SQLCODE=-99999**

下一步 :: 尝试不同格式的 DSN,结合数据库、主机名和端口

>>> dsn = "DATABASE=Dbname:hostname.domain:466;PROTOCOL=TCPIP"
>>> conn = ibm_db.connect(dsn,'mytextuid','password')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: [IBM][CLI Driver] SQL10007N Message "0" could not be retrieved.  
  **Reason code: "6". SQLCODE=-1024**

下一步 :: 尝试一个已知良好的系统 DSN,因为我在 SSMS 中使用它

>>> conn = ibm_db.connect('DSN=SYSTEM_DB2_DSN','mytextuid','password')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: [IBM][CLI Driver] SQL10007N Message "0" could not be retrieved.  
  **Reason code: "6". SQLCODE=-1013**

下一步 :: 尝试使用与上面相同配置的用户 DSN

>>> conn = ibm_db.connect("DSN=USER_DB2_DSN","mytextuid","password")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: [IBM][CLI Driver]  
  **SQLSTATE=HY009 SQLCODE=-99999**

下一步 :: 在 ODBC 系统 DSN 上启用跟踪(结果:ODBC 管理在连接时挂起)

C:\clidriver\db2trace.log>cat p8516t4948.cli


[ Process: 8516, Thread: 4948 ]
[ Date & Time:               02/27/2018 15:28:34.282526 ]
[ Product:                   QDB2/NT64 DB2 v11.1.2021.1452 ]
[ Level Identifier:          0203010F ]
[ CLI Driver Version:        10.01.0000 ]
[ Informational Tokens:      "DB2 v11.1.2021.1452","s1709221349","DYN1709221349W
IN64","Fixpack 2a" ]
[ Install Path:              C:\clidriver ]
[ db2cli.ini Location:       C:\Users\mytextuid\db2cli.ini ]
[ db2cli.ini Location2:      C:\ProgramData\IBM\DB2\C_clidriver\cfg\db2cli.ini ]

[ db2dsdriver.cfg Location:  C:\ProgramData\IBM\DB2\C_clidriver\cfg\db2dsdriver.
cfg ]
[ CLI Driver Type:           IBM Data Server Driver For ODBC and CLI ]



[0000008516 0000004948] [02/27/2018 15:28:34.283197] SQLAllocEnv(phEnv=&0000000000392b00 )
[0000008516 0000004948] [02/27/2018 15:28:34.284702]     ---> Time elapsed - 0 seconds

[0000008516 0000004948] [02/27/2018 15:28:34.299819] SQLAllocEnv( phEnv=0:1 )
[0000008516 0000004948] [02/27/2018 15:28:34.301458]     <--- SQL_SUCCESS   Time elapsed - +1.826100E-002 seconds

[0000008516 0000004948] [02/27/2018 15:28:34.302199] SQLAllocConnect( hEnv=0:1,phDbc=&0000000000392b08 )
[0000008516 0000004948] [02/27/2018 15:28:34.304124]     ---> Time elapsed - +7.410000E-004 seconds

[0000008516 0000004948] [02/27/2018 15:28:34.305055] SQLAllocConnect( phDbc=0:1)
[0000008516 0000004948] [02/27/2018 15:28:34.305902]     <--- SQL_SUCCESS   Time
 elapsed - +3.703000E-003 seconds

[0000008516 0000004948] [02/27/2018 15:28:34.306285] SQLDriverConnect( hDbc=0:1,hwnd=0:0,szConnStrIn="DSN=DSNNAME;UID=mytextuid;PWD=********;AUTOCOMMIT=0;CONNECTTYPE=1;", cbConnStrIn=-3, szConnStrOut=&0000000000103230, cbConnStrOutMax=256,pcbConnStrOut=&00000000001031f6,fDriverCompletion=SQL_DRIVER_NOPROMPT )
[0000008516 0000004948] [02/27/2018 15:28:34.308920]     ---> Time elapsed - +3.830000E-004 seconds
    sqlccconnr( timeout - +0.000000E+000, protocol - 0x03 )

下一步 :: 观看 c:\ProgramData\IBM\DB2\C_clidriver\db2diag.log

我在 ODBC Admin 中测试 DSN 的连接,这是我收到的条目...注意::下面的“DB”、APPID 和 HOSTNAME 已被混淆...我不知道为什么许可证是这样的需要使用此驱动程序,如果这也是问题

2018-02-27-16.29.43.560000-480 E27622F847           LEVEL: Error
PID     : 13452                TID : 4948           PROC : odbcad32.exe
INSTANCE:                      NODE : 000           DB   : DBNAME
APPID   : my.ipa.ddr.ess.65253.180228002943
HOSTNAME: ${COMPUTERNAME}
EDUID   : 4948
FUNCTION: DB2 UDB, Connection Manager, sqleuPerformServerActivationCheck, probe:110
MESSAGE : ADM12008C  The product "IBM Data Server Driver For ODBC and CLI" does 
          not have a valid license key installed and the evaluation period has 
          expired. Functions specific to this product are not enabled. If you 
          have licensed this product, ensure the license key is properly 
          installed. You can install the license using the db2licm command. The 
          license file can be obtained from your licensed product CD.
python db2 odbc dsn
1个回答
0
投票

试试这个(Python3和Python2):

import ibm_db as db2

def make_connexion(server, port, database, username, password, timeout):
    return db2.connect('DATABASE={0};'.format(database) +
                  'HOSTNAME={0};'.format(server) +
                  'PORT={0};'.format(str(port)) +
                  'PROTOCOL=TCPIP;' +
                  'UID={0};'.format(username) +
                  'PWD={0};'.format(password) +
                  'ConnectTimeout={0};'.format(str(timeout))
                  , '', '')

# sample connexion object
connexion = make_connexion('localhost', '50000', 'database', 'username', 'password', '30')
© www.soinside.com 2019 - 2024. All rights reserved.