簡體   English   中英

使用 Python 連接到 db2 數據庫

[英]Connect to db2 database with Python

我正在開發一個需要連接到 ibm db2 數據庫的應用程序。 使用 DBeaver 我可以成功連接到數據庫(我向他提供了db2cc.jardb2cc4.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 數據庫的操作系統和
  • 正在使用哪種客戶端(java、odbc/cli、.net 等),以及
  • 數據庫采用了哪種身份驗證/加密(ssl、基於服務器的身份驗證/+/-/加密等)。
  • 是遠程數據庫 rdbms Apache DERBY 或 Db2。

在開始之前先了解這些基礎知識。 您必須與運行 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.

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