如何将 Python 连接到 Db2

Posted

技术标签:

【中文标题】如何将 Python 连接到 Db2【英文标题】:How to connect Python to Db2 【发布时间】:2011-08-28 00:14:30 【问题描述】:

有没有办法将 Python 连接到 Db2?

【问题讨论】:

【参考方案1】:

有多种方法可以从 Python 连接到 Db2。我正在尝试提供选项摘要。请注意,现在在许多环境中强制执行 SSL/TLS,这需要额外的参数(见下文)。

Db2 和 Python 驱动程序

Db2 不为 Python 提供一个,而是四个驱动程序(客户端)。 Db2 documentation page "Python, SQLAlchemy, and Django Framework application development for IBM Database servers" 很好地概述了四个驱动程序:

ibm_db 基于 IBM 定义的 API, ibm_db_dbi 是 Python 数据库 API (DBI) 的驱动程序, ibm_db_sa 实现了 Python SQLAlchemy 接口和 ibm_db_django 在 Django 框架中充当 Db2 驱动程序。

请注意,还有其他 Python 数据库接口利用现有的 JDBC 或 ODBC 驱动程序,可用于连接到 Db2。您可以将 SQLAlchemy (ibm_db_sa) 与流行的 Flask framework 一起使用。要将 Db2 与 pandas 一起使用,请使用 ibm_db_dbi。以上所有Db2 drivers are available on GitHub 均基于 CLI(调用级接口/ODBC)。还有其他方法可以连接到 Db2,例如,通过使用基于 ODBC 的第 3 方包装器等等。

Db2 连接

典型的连接信息由 Db2 服务器(主机名)、端口、数据库名称和用户名/密码信息组成。如果未指定其他内容,大多数驱动程序会假定连接未加密。因此,要通过加密连接进行连接,需要更多参数。它们取决于 Db2 版本、Db2 产品的类型等等。让我们开始吧。

Newer Db2 versions simplified the use of SSL/TLS because certificates are now part of the package。典型的连接字符串如下所示:

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”,告诉驱动程序使用encryption for the data in transit。

Db2 连接字符串可以有更多选项。这取决于启用的安全插件。有关更多链接和讨论,请参阅connecting from Python to Db2 上的此博客文章。

【讨论】:

【参考方案2】:

有一种方法可以只使用 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']

变量 rows 将包含您的查询结果。根据您的方便使用它。 我没有使用任何 DDL 查询。但我认为它们应该像 DML 查询一样工作。不过不确定!

【讨论】:

虽然此链接可以提供问题的答案,但有必要将所有需要的信息添加到答案中,如果链接的内容被时间删除,您的答案应该仍然提供信息。 @Ruli 该视频自 2018 年以来一直存在,不要认为它会被删除。将尝试在答案中包含信息:) 视频已被删除,信息不在答案中,所以... @RotBot 感谢您的评论...更新...干杯!【参考方案3】:
# 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()

【讨论】:

【参考方案4】:

我在 2021 年的表现如何。 你需要什么:

Python 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

到目前为止,我能学到的几乎就是这些了。 希望对大家有帮助。

【讨论】:

【参考方案5】:

版本: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;", "", "")

【讨论】:

【参考方案6】:

IBM 的 Db2 可用于各种平台。如果您尝试连接到位于 IBM i 服务器(以前称为 AS/400、iSeries 或 System i)上的 Db2,那么 ibm_db 需要一个名为 Db2 Connect 的产品,该产品相当昂贵。大多数使用 Python 连接到 Db2 for i 的人都使用 ODBC(通常通过 PyODBC)。

我不完全确定 Db2 在他们的 z(大型机)服务器上的情况,但我认为它也需要 Db2 Connect。

【讨论】:

【参考方案7】:

除了@prof1990 response:

从 2.0.9(2018 年 8 月 16 日)开始,您也可以简单地使用 Python 3:

pip install ibm_db

参考:

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

连接示例here:

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

【讨论】:

【参考方案8】:

经过大量挖掘,我发现了如何使用 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)

查看this link 获取不准确的官方文档

【讨论】:

老实说,我只是为了 2.0.8a 小费而赞成这个。我无法验证连接字符串,因为我没有 ibm_db 使用的驱动程序。我确实有一个适用于 pyodbc 的 ODBC 驱动程序,所以这就是我实际使用的。【参考方案9】:

您可以使用 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)

【讨论】:

【参考方案10】:

这是供将来参考:

Official installation docs说:

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

pip install ibm_db

它只适用于我的 Python 2.7; 3.X 没有。另外,我必须将 Python 2.7 设为默认(而不是 Python 3),这样安装才能正常运行(否则会出现安装错误)。

Official docs sample usage:

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

【讨论】:

这个答案仍然部分正确,但是情况发生了变化,ibm_db 现在在使用正确的版本时支持最高 3.6.5,有关详细信息,请参阅我的答案。【参考方案11】:

文档很难找到,一旦找到,它就非常糟糕。以下是我在过去 3 小时内发现的内容。

需要使用pip安装ibm_db,如下:

pip install ibm_db

您需要创建一个连接对象。 The documentation is here.

这是我写的:

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:值。

希望这一切都有帮助。

【讨论】:

我得到 SQLCODE=-104 的行:rows = results(exec_immediate(connection, sql)) 知道是什么导致了这个错误吗? 不应该是这样的:sql = 'SELECT * FROM ' + t[170]['TABLE_NAME'] @daixtr - 嗯... IDK。我不再使用 DB2,所以我无法验证 LIST 是否是有效命令。也许这是一个错字,我的意思是SELECT。如果您有一个 DB2 实例要检查,也许您可​​以验证然后编辑我的答案(或者在 cmets 中告诉我,如果您没有足够的代表自己做,我可以编辑它。)【参考方案12】:

您可以使用 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)

【讨论】:

我们如何获得ibm_db 库? @ArtOfWarfare,只需导入它。 pip install ibm_db【参考方案13】:

ibm-db,Python 和 Django 的官方 DB2 驱动程序在这里:

https://code.google.com/p/ibm-db/

这是关于如何在 Ubuntu Linux 上安装所有内容的最新教程:

http://programmingzen.com/2011/05/12/installing-python-django-and-db2-on-ubuntu-11-04/

我应该提一下,有几个用于 Python 的较旧的非官方 DB2 驱动程序。 ibm-db 是您应该使用的。

【讨论】:

它已经过时了。它还需要 IBM_DB_DI 和 ibm_db,这需要大量的安装工作。典型的 IBM 笨拙。

以上是关于如何将 Python 连接到 Db2的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Android 应用程序连接到 python-socketio 后端?

如何通过蓝牙将 iPhone 连接到本地 Python 客户端?

如何将 PyCharm 连接到位于 Docker 容器内的 python 解释器?

如何将前端 HTML/JQuery 连接到后端 Python

如何将python连接到sqlite3并一次填充多行

如何使用 IAM Auth 将 python websocket 连接到 AppSync 订阅?