簡體   English   中英

如何將 Python 連接到 Db2

[英]How to connect Python to Db2

有沒有辦法將 Python 連接到 Db2?

文檔很難找到,一旦找到,它就非常糟糕。 這是我在過去 3 小時內發現的內容。

您需要使用pip安裝ibm_db ,如下所示:

pip install ibm_db

您需要創建一個連接對象。 文檔在這里。

這是我寫的:

from ibm_db import connect
# Careful with the punctuation here - we have 3 arguments.
# The first is a big string with semicolons in it.
# (Strings separated by only whitespace, newlines included,
#  are automatically joined together, in case you didn't know.)
# The last two are emptry strings.
connection = connect('DATABASE=<database name>;'
                     'HOSTNAME=<database ip>;'  # 127.0.0.1 or localhost works if it's local
                     'PORT=<database port>;'
                     'PROTOCOL=TCPIP;'
                     'UID=<database username>;'
                     'PWD=<username password>;', '', '')

接下來,您應該知道ibm_db的命令實際上永遠不會給您結果。 相反,您需要重復調​​用命令上的其中一種fetch方法來獲取結果。 我寫了這個輔助函數來處理這個問題。

def results(command):
    from ibm_db import fetch_assoc

    ret = []
    result = fetch_assoc(command)
    while result:
        # This builds a list in memory. Theoretically, if there's a lot of rows,
        # we could run out of memory. In practice, I've never had that happen.
        # If it's ever a problem, you could use
        #     yield result
        # Then this function would become a generator. You lose the ability to access
        # results by index or slice them or whatever, but you retain
        # the ability to iterate on them.
        ret.append(result)
        result = fetch_assoc(command)
    return ret  # Ditch this line if you choose to use a generator.

現在定義了該輔助函數,您可以輕松地執行以下操作,例如獲取數據庫中所有表的信息:

from ibm_db import tables

t = results(tables(connection))

如果您想查看給定表中的所有內容,您現在可以執行以下操作:

from ibm_db import exec_immediate

sql = 'LIST * FROM ' + t[170]['TABLE_NAME']  # Using our list of tables t from before...
rows = results(exec_immediate(connection, sql))

現在rows包含數據庫中第 170 個表中的行list ,其中每一行都包含列名的dict :值。

希望這一切都有幫助。

經過大量挖掘,我發現了如何使用 ibm_db 連接 DB2。

首先,如果您使用高於 3.2 的 python 版本,請使用

pip install ibm_db==2.0.8a

版本 2.0.8(最新)將無法安裝。

然后使用以下連接

import ibm_db_dbi as db

conn = db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;PWD=password;", "", "")

列出表

for t in conn.tables():
    print(t)

並執行 SQL

cursor = conn.cursor()
cursor.execute("SELECT * FROM Schema.Table")
for r in cursor.fetchall():
    print(r)

檢查此鏈接以獲取官方不太准確的文檔

ibm-db,Python 和 Django 的官方 DB2 驅動程序在這里:

這是有關如何在 Ubuntu Linux 上安裝所有內容的最新教程:

我應該提一下,有幾個用於 Python 的較舊的非官方 DB2 驅動程序。 ibm-db 是您應該使用的。

除了@prof1990回復

從 2.0.9(2018 年 8 月 16 日)開始,也可以使用 Python 3:

pip install ibm_db

參考:

https://github.com/ibmdb/python-ibmdb#updated-ibm_db

這里的連接示例:

import ibm_db
ibm_db.connect("DATABASE=<dbname>;HOSTNAME=<host>;PORT=<60000>;PROTOCOL=TCPIP;UID=<username>;PWD=<password>;", "", "")

完整的 API 文檔在這里:

https://github.com/ibmdb/python-ibmdb/wiki/APIs

您可以使用 jaydeapi 從 python 連接到 db2 首先安裝庫運行 pip install jaydeapi 下載 db2jcc4.jar 然后您可以使用以下代碼連接:通過傳遞主機名、端口號、用戶 ID、密碼數據庫名稱

import jaydebeapi

conn_src = jaydebeapi.connect(
    'com.ibm.db2.jcc.DB2Driver',
    ['YourHostName:PortNo/DatabaseName','userid','password'],'C:/db2jcc4.jar'
)

cursor=conn_src.cursor()
sql = 'Select * from schemaname.TableName fetch first 100 rows only '

cursor.execute(sql)
print("fetchall:")
result = cursor.fetchall()
for r in result:
    print(r)

有一種方法可以只使用 Python 請求庫連接到 IBM db2。 為我工作。

步驟1:
轉到 IBM CLOUD 儀表板 -> 導航到您的 IBM db2 實例 -> 單擊“服務憑證”
應該有一個默認的,如果沒有,創建一個。 該服務憑證是一本字典。 復制服務憑據。

第2步:

db2id = { // service credential dictionary here //}
api = "/dbapi/v3"
host = db2id['https_url']+api
userinfo = {"userid":db2id['username'],"password":db2id['password']}
service = '/auth/tokens'
r = requests.post(host+service,json=userinfo)
access_token = r.json()['token']
auth_header = {"Authorization": "Bearer "+access_token}

// Connection to database established

第 3 步
現在您可以運行 SELECT、INSERT、DELETE、UPDATE 查詢
INSERT、DELETE、UPDATE 查詢的格式相同。 在 INSERT、DELETE、UPDATE 查詢之后,必須發送 COMMIT 查詢,否則不會反映更改。 (您也應該提交您的更改)
插入/更新/刪除查詢

sql = " your insert/update/delete query here "
sql_command = {"commands":sql,"limit":1000,"separator":";","stop_on_error":"yes"}
service = "/sql_jobs"
r = requests.post(host+service,headers=auth_header,json=sql_command)
sql_command = {"commands":"COMMIT","limit":1000,"separator":";","stop_on_error":"yes"}
service = "/sql_jobs"
r = requests.post(host+service,headers=auth_header,json=sql_command)

您可以使用變量 r 檢查您的請求的狀態

選擇查詢

sql = " your select query here "
service = "/sql_jobs"
r = requests.post(host+service,headers=auth_header,json=sql_command)
jobid = r.json()['id']
r = requests.get(host+service+"/"+jobid,headers=auth_header)
results = r.json()['results']
rows = results[0]['rows']

變量行將包含您的查詢結果。 根據您的方便使用它。

我沒有使用任何 DDL 查詢。 但我認為它們應該像 DML 查詢一樣工作。 雖然不確定!

IBM 的 Db2 可用於各種平台。 如果您嘗試連接到位於 IBM i 服務器(以前稱為 AS/400、iSeries 或 System i)上的 Db2,那么 ibm_db 需要一個名為Db2 Connect的產品,該產品相當昂貴。 大多數使用 Python 連接到 Db2 for i 的人都使用 ODBC(通常通過PyODBC )。

我不完全確定 Db2 在他們的 z(大型機)服務器上的情況,但我認為它也需要 Db2 Connect。

有多種方法可以從 Python 連接到 Db2。 我正在嘗試提供選項摘要。 請注意,現在在許多環境中強制實施 SSL/TLS,這需要額外的參數(見下文)。

Db2 和 Python 驅動程序

Db2 不為 Python 提供一個,而是四個驅動程序(客戶端)。 Db2 文檔頁面“IBM 數據庫服務器的 Python、SQLAlchemy 和 Django 框架應用程序開發”很好地概述了這四個驅動程序:

請注意,還有其他 Python 數據庫接口利用現有的 JDBC 或 ODBC 驅動程序,可用於連接到 Db2。 您可以將 SQLAlchemy (ibm_db_sa) 與流行的Flask 框架一起使用。 要將 Db2 與pandas一起使用,請使用 ibm_db_dbi。 以上所有Db2 驅動程序都可在 GitHub 上獲得,並且基於 CLI(調用級接口/ODBC)。 還有其他方法可以連接到 Db2,例如,通過使用基於 ODBC 的第 3 方包裝器等等。

Db2 連接

典型的連接信息由 Db2 服務器(主機名)、端口、數據庫名稱和用戶名/密碼信息組成。 如果沒有指定其他內容,大多數驅動程序會假定連接未加密。 因此,要通過加密連接進行連接,需要更多參數。 它們取決於 Db2 版本、Db2 產品的類型等等。 讓我們輕松開始吧。

較新的 Db2 版本簡化了 SSL/TLS 的使用,因為證書現在是包的一部分 典型的連接字符串將如下所示:

conn_str='database=MYDB;hostname=db2host.example.com;port=50001;protocol=tcpip;uid=db2inst1;pwd=secret;security=SSL'

ibm_db_conn = ibm_db.connect(conn_str,'','')

一個重要的參數是“security=SSL”,告訴驅動程序對傳輸中的數據使用加密

Db2 連接字符串可以有更多選項。 這取決於啟用的安全插件。 有關更多鏈接和討論,請參閱這篇關於從 Python 連接到 Db2的博客文章。

SQL Alchemy 連接

將 Db2 與 SQLAlchemy 一起使用時,傳遞類似於以下內容的 URI

ibm_db_sa://user:password@hostname:port/database?Security=SSL

建立連接。

您可以使用 ibm_db 庫來連接 DB2。

query_str = "SELECT COUNT(*) FROM table_name"

conn = ibm_db.pconnect("dsn=write","usrname","secret")
query_stmt   = ibm_db.prepare(conn, query_str)
ibm_db.execute(query_stmt)

這是供將來參考:

官方安裝文檔說:

Python 2.5 或更高版本,不包括 Python 3.X。

pip install ibm_db

它只適用於我的 Python 2.7; 3.X 沒有。 另外,我必須將 Python 2.7 設為默認(而不是 Python 3),這樣安裝才能正常工作(否則會出現安裝錯誤)。

官方文檔示例用法

import ibm_db 
ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username; PWD=password;", "", "")

版本:ibm-db 3.0.2 - ibm-db==3.0.2

pip install ibm-db

發布時間:2020 年 6 月 17 日

連接到本地或編目數據庫:

import ibm_db
conn = ibm_db.connect("database","username","password")

連接到未編目的數據庫:

import ibm_db
ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;
            PWD=password;", "", "")

我在 2021 年是如何做到的。你需要什么:

  • 蟒蛇 3.7
  • PipEnv
  • ibm數據庫

ibm-db 版本並不重要,但這個庫只適用於 Python 3.7(當前的 Python 版本是 3.9)。

在您的機器上安裝 Python 3.7.6(這是有效的版本)。

在您的 IDE 中創建一個新的 python 文件。

讓我們創建一個虛擬環境以確保我們將使用 Python 3.7

pip install pipenv

安裝后

pipenv install --python 3.7

激活虛擬環境

pipenv shell

您可以使用pip list來驗證您是否在新的虛擬環境中 - 如果列表僅顯示 3 或 4 個庫,那是因為您是

現在您可以下載 Ibm_db

pip install ibm-db

您可以將此添加到您的代碼中以確認您使用的是什么版本

from platform import python_version
print(python_version())

現在訪問 DB2

import ibm_db_dbi as db

# Connect to DB2B1 (keep Protocol as TCPIP)
conn = db.connect("DATABASE=DBNAME;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=Your User;PWD=Your Password;", "", "")

檢查所有可用的表

for t in conn.tables():
    print(t)

您的 SQL 代碼:

sql_for_df = """SELECT *
                FROM TABLE
                WHERE ..."""

可視化為 DataFrame

首先安裝 pandas,因為它不會出現在您的虛擬環境中

pip install pandas

之后導入您的代碼並玩轉

import pandas as pd 

df = pd.read_sql(sql_for_df, conn) 
df.head()

要退出虛擬環境,只需在終端中寫入exit 如果要刪除虛擬環境,請在終端pipenv --rm中寫入

到目前為止,我能學到的幾乎就是這些了。 希望對大家有幫助。

# Install : ibm_db package
# Command : pip install ibm_db

import ibm_db
import sys


def get_connection():
    db_name = ""
    db_host_name = ""
    db_port = ""
    db_protocol = ""
    db_username = ""
    db_password = ""

    try:
        conn = ibm_db.connect(
        f"DATABASE = {db_name}; HOSTNAME = {db_host_name}; PORT = {db_port}; PROTOCOL = {db_protocol}; "
        f"UID = {db_username}; PWD = {db_password};", "", "")
        return conn
    except:
        print("no connection:", ibm_db.conn_errormsg())
        sys.exit(1)

get_connection()

暫無
暫無

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

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