Как подключиться к DB2 через пакет Python ibm_db

Я пытаюсь подключиться к локальной базе данных DB2 через python, но безуспешно в течение последних нескольких дней. Я надеюсь, что сообщество может помочь мне расшифровать сообщения об ошибках и предложить помощь на основе их опыта.

Моя цель - установить библиотеку Python ibm_db на моем ноутбуке с Windows 7 и подключиться к нашему экземпляру DB2

Я не могу получить метод ibm_db.connect() для распознавания системного DSN или пользовательского DSN, которые известны как хорошие (я использую их для подключения к DB2 через Sql Server Management Studio (SSMS))

Я получаю приведенные ниже ошибки от различных комбинаций соединений (показанных ниже), но я не нашел ни одной ссылки, в которой говорилось бы, что означают ошибки, и что я могу сделать, чтобы решить проблему. Я искал и читал десятки веб-сайтов и документов IBM, но ни одна не упоминала эту информацию. -> У меня такое чувство, что я пропускаю какой-то простой шаг, но я не знаю, чего я не знаю на данный момент:)

Примечания по конфигурации системы::

  • Ноутбук с Windows 7

  • DB2 версия 7.3

  • Python 2.7.13 | Anaconda 4.4.0 (64-разрядная версия)| (по умолчанию, 11 мая 2017 г., 13:17:26) [MSC v.1500 64 бит (AMD64)] на win32

  • Установленные версии библиотеки Python, которые кажутся подходящими

  • IBM-дБ (2.0.8)
  • IBM-DB-SA (0,3,3)
  • pyodbc (4.0.16)
  • pyOpenSSL (17.0.0)

  • У меня установлен и работает Навигатор iSeries, в который входит драйвер ODBC iSeries. Он отлично работает для подключения к локальным экземплярам DB2

  • У меня установлен интерфейс командной строки DB2, в который добавлен ДРАЙВЕР с именем IBM DB2 ODBC DRIVER - C_clidriver в реестре и в списке драйверов 64-битного ODBC-менеджера

  • Вот файл DSN, который я создал из драйвера ODBC iSeries, который работает, но выглядит совсем не так, как DSN, который я использую для драйвера IBM CLI:

    [ODBC] DRIVER = Драйвер ODBC для iSeries Access 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**

Далее:: Добавить драйвер с именем с ТОЧНЫМ именем драйвера, как есть в реестре

>>> 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, комбинируя 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**

Далее:: попробуйте пользовательский 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:: Enabled Trace в системном DSN ODBC (результат: администратор 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

Я проверяю соединение для DSN в ODBC Admin, и это - запись, которую я получаю... Примечание: "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.

1 ответ

Попробуйте это (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')
Другие вопросы по тегам