[英]SQLCODE=-30081 Cannot connect to IBM DB2 database with python
[英]Connect to db2 database with Python
我正在開發一個需要連接到 ibm db2 數據庫的應用程序。 使用 DBeaver 我可以成功連接到數據庫(我向他提供了db2cc.jar和db2cc4.jar文件)。
在我看來,DBeaver 正在使用我的 Window 憑據登錄,因為我不需要輸入任何登錄名或密碼來連接。
現在,我一直在嘗試使用 python 3.7 和 pypi 最新版本的ibm_db包連接到同一個數據庫。 我沒有安裝其他任何東西。
import ibm_db
# ...
connection_string = "DATABASE=" + self.params['schema'] + ";" + \
"HOSTNAME=" + self.params['host'] + ";" + \
"PORT=" + self.params['port'] + ";" + \
"PROTOCOL=TCPIP;" + \
"SECURITYMECHANISM=4;" + \
"UID=" + self.params['user'] + ";" + \
"PWD=" + self.params['password'] + ";"
try:
self.connection = ibm_db.connect(connection_string, "", "")
# ...
在參數中使用我的 Windows 憑據,我收到以下錯誤消息:
Connection error
Bad credentials
SQLCODE=-30082
08001
從我所看到的堆棧溢出連接到 db2 數據庫是復雜的......
有人知道怎么連接嗎? 使用 Windows 憑據或其他方式...
謝謝 !
嘗試以下連接字符串,如果您的 db2 客戶端和服務器在同一主機上。 根據您的情況更改“mydb”和“DB2”(db2 實例名稱,您可以使用 db2ilist 實用程序獲取它)常量。
ibm_db.connect('DATABASE=mydb;Instance=DB2;PROTOCOL=IPC;', '', '')
Db2 與 Python 配合良好。
在開始之前,您需要了解一些基礎知識,例如:
在開始之前先了解這些基礎知識。 您必須與運行 Db2-server 的人交談。
注意:在您的問題中,您提到 ( SecurityMechanism=4
) com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY - 這與非 JAVA 客戶端無關,相關的是數據庫管理器是 DERBY 。
對於python,ibm_db 包不是java 應用程序。
DBeaver 是一個 Java 應用程序(因此它使用 db2jcc.jar 或 db2jcc4.jar 和一個許可證文件來連接到遠程數據庫)。
當 Db2 數據庫在 Microsoft-Windows 上運行時,您只能使用 Windows 憑據連接到 Db2 數據庫,並且憑據在運行 Db2 服務器的主機名上工作。 對於任何其他組合,管理員必須為您提供與目標主機名相關的用戶 ID/密碼。
ibm_db 包需要安裝 Db2 客戶端。 Db2 客戶端是可單獨安裝的。 根據運行 Db2 服務器的操作系統以及需要在 Db2 客戶端中擁有多少功能,有不同類型的 Db2 客戶端。 如果您的遠程 Db2 服務器在 Linux、Unix、Windows 或 Z/OS 上運行,那么您可以使用“IBM Data Server Runtime Client”,您可以從 IBM 的通行證優勢網站下載,或者從您的內部 IT 人員那里獲取。 如果您的 Db2 服務器在 i 系列 (AS/400) 上運行,您應該從 i 系列管理員那里獲取其驅動程序。 對於 Z/OS 或 i 系列,您還需要一個許可證文件(需要花錢),您應該從管理員那里獲得該文件,除非您的公司使用名為 Db2-connect 的網關產品,在這種情況下您不需要工作站上的單獨許可證文件。
添加ibm_db庫並在 .py 文件的頂部導入 ibm_db。
def get_db_connection():
"""
This will help to get db2 connection for query execution
:return: conn
"""
dsn_driver = "{IBM DB2 ODBC DRIVER}"
dsn_database = "BLUDB"
dsn_hostname = "your_hostname"
dsn_port = "50000"
dsn_protocol = "TCPIP"
dsn_uid = "your_userid"
dsn_pwd = "your_pwd"
dsn = (
"DRIVER={0};"
"DATABASE={1};"
"HOSTNAME={2};"
"PORT={3};"
"PROTOCOL={4};"
"UID={5};"
"PWD={6};").format(dsn_driver, dsn_database, dsn_hostname, dsn_port, dsn_protocol, dsn_uid, dsn_pwd)
try:
conn = ibm_db.connect(dsn, "", "")
print("Connected!")
return conn
except Exception:
print("\nERROR: Unable to connect to the \'" + dsn_database + "\' server.")
print("error: ", ibm_db.conn_errormsg())
exit(-1)
函數 get_db_connection() 將返回連接對象。 在該連接對象上,您可以執行如下操作:
conn = get_db_connection()
list_results = []
select_query = 'SELECT a.STATUS, a.ID FROM "TABLE_NAME" AS a'
print(select_query)
selectStmt = ibm_db.exec_immediate(conn, select_query)
while ibm_db.fetch_row(selectStmt) != False:
list_results.append(ibm_db.result(selectStmt, 'ID'))
ibm_db.close(conn)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.