簡體   English   中英

如何通過 ibm_db python 包連接到 DB2

[英]How do I connect to DB2 via ibm_db python package

我正在嘗試通過 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)win32 上的 [MSC v.1500 64 位 (AMD64)]

  • 安裝的 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 Access ODBC 驅動程序 DATABASE=DBASE PKG=QGPL/DEFAULT(IBM),2,0,1,0,512 LANGUAGEID=ENU DFTPKGLIB=QGPL DBQ=QGPL SYSTEM=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**

Next :: 在注冊表中添加名稱為 EXACT 驅動程序名稱的驅動程序

>>> 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**

Next :: 嘗試不同格式的 DSN,結合 DATABASE、HOSTNAME 和 PORT

>>> 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**

Next :: 嘗試使用與上述相同配置的用戶 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**

Next :: 在 ODBC 系統 DSN 上啟用跟蹤(結果:ODBC Admin 在連接時掛起)

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 )

Next :: 看 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.

試試這個(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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM