如何将Python连接到Db2

45

有没有一种方法将Python连接到Db2数据库?

14个回答

36
文档很难找到,而且一旦找到了,质量也相当糟糕。以下是我在过去的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个表中的一系列行,其中每一行都包含了一个 dict,其键为列名,值为对应的值。
希望这些能帮到你。

我在这一行代码中遇到了SQLCODE=-104的错误:rows = results(exec_immediate(connection, sql))你有什么想法是什么导致了这个错误吗? - chrisheinze
@crh878 - IBM DB2文档表示SQLCODE=-104意味着您有一个非法符号或标记。我建议您在之前的行上打印(print)sql,然后将该输出复制并粘贴到另一个评论中,以便您自己找出问题所在。 - ArtOfWarfare
难道不应该像这样吗:sql = 'SELECT * FROM ' + t[170]['TABLE_NAME'] - daparic
@daixtr - 嗯...我不再使用DB2,因此无法验证“LIST”是否是有效命令。也许这是一个笔误,我想说的是“SELECT”。如果你有一个DB2实例可以进行检查,也许你可以验证一下,然后编辑我的答案(或者在评论中告诉我,我可以编辑它,如果你没有足够的声望来自己完成编辑)。 - ArtOfWarfare

17

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

查看此链接以获取官方的不太准确文件。


2
说实话,我只是因为2.0.8a提示而点赞。我无法验证连接字符串,因为我没有ibm_db使用的驱动程序。我有一个适用于pyodbc的ODBC驱动程序,所以那就是我实际使用的。 - John Y

10

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

4

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

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

第三步
现在您可以运行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查询一样工作。虽然不确定!


虽然这个链接可以回答问题,但是必须添加所有需要的信息到答案中。如果链接内容被删除,你的答案仍应该是有用的。 - Ruli
@Ruli,这个视频自2018年以来就一直存在,我不认为它会被删除。我会尽力在答案中包含相关信息 :) - Franky Pinto
2
视频已被删除,答案中也没有相关信息,所以... - RotBot

1

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

Db2和Python驱动程序

Db2没有提供一个,而是四个Python驱动程序(客户端)。 Db2文档页面“针对IBM数据库服务器的Python、SQLAlchemy和Django Framework应用程序开发” 提供了关于这四个驱动程序的很好的概述:

请注意,有其他的Python数据库接口可以利用现有的JDBC或ODBC驱动程序来连接到Db2。您可以使用SQLAlchemy(ibm_db_sa)与流行的Flask框架。要使用pandas连接Db2,请使用ibm_db_dbi。上述所有Db2驱动程序都可在GitHub上获得,并且基于CLI(调用级别接口/ODBC)。还有其他连接到Db2的方法,例如通过使用第三方基于ODBC的包装器等。

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的博客文章。
SQLAlchemy连接:
使用Db2和SQLAlchemy时,传递类似于
ibm_db_sa://user:password@hostname:port/database?Security=SSL
的URI以建立连接。

1

IBM的Db2适用于各种平台。如果您正在尝试连接到运行在IBM i服务器(以前称为AS/400、iSeries或System i)上的Db2,则需要使用名为Db2 Connect的产品,而这相当昂贵。大多数使用Python连接到Db2 for i的人使用ODBC(通常通过PyODBC)。

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


1
这是我成功地从Python连接IBM DB2并检索结果的方法。
问题:
当我尝试安装pip install ibm-db时,出现了以下错误:
pip install ibm-db
running build_ext
building 'ibm_db' extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
  ----------------------------------------
ERROR: Failed building wheel for ibm-db
Failed to build ibm-db
ERROR: Could not build wheels for ibm-db, which is required to install pyproject.toml-based projects.

解决方案:
我从https://python-forum.io/thread-38681.html找到了以下步骤:
1. 在G:\div_code\answer目录下,运行以下命令: ``` python -m venv ibm_env ```
2. 进入ibm_env目录: ``` cd ibm_env\ ```
3. 激活虚拟环境: ``` G:\div_code\answer\ibm_env\Scripts\activate ```
4. 在激活的虚拟环境中,安装ibm-db: ``` pip install ibm-db ```
我将以下文件夹/文件从ibm_env\Lib\site-packages复制到了我安装Python的Python36\Lib\site-packages目录下:
- ibm_db - ibm_db_dbi - certs(文件夹) - clidriver(文件夹) - ibm_db_dlls(文件夹) - ibm_db_tests(文件夹) - ibm_db-3.1.3-py3.6.egg-info(文件夹)

0
你可以使用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
1
@ArtOfWarfare,只需导入它。pip install ibm_db - Soumendra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接