如何将 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)
并使用
执行 SQLcursor = 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 解释器?