如何将python连接到db2

时间:2011-05-18 12:00:41

标签: python db2

有没有办法to connect python to DB2

12 个答案:

答案 0 :(得分:15)

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

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

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列名:value。

希望这一切都有所帮助。

答案 1 :(得分:10)

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

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

我应该提到Python有几个较旧的非官方DB2驱动程序。 ibm-db是你应该使用的那个。

答案 2 :(得分:5)

经过大量挖掘后,我发现了如何使用ibm_db与DB2建立连接。

首先,如果你使用高于3.2的python版本

  

pip install ibm_db == 2.0.8a

版本2.0.8(最新版本)将无法安装。

然后使用以下内容连接

. as $in | keys_unsorted | map ({"key": ., "size" : $in[.].size}) | sort_by(.size) | map(.key | {(.) : $in[.]}) | add

使用

列出表格
import ibm_db_dbi as db

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

并使用

执行SQL
for t in conn.tables():
    print(t)

检查this link官方不太准确的文档

答案 3 :(得分:2)

您可以使用jaydeapi从python连接到db2 首先安装库运行pip install jaydeapi 下载db2jcc4.jar 然后你可以使用下面的代码连接: 通过传递hostname,portno,userid,密码数据库名称

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)

答案 4 :(得分:1)

除了@ 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

答案 5 :(得分: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)

答案 6 :(得分:0)

这是为了将来参考:

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

答案 7 :(得分:0)

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

我不确定他们的z(大型机)服务器上使用Db2的情况,但是我认为这也需要Db2 Connect。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

有一种方法可以使人仅使用Python请求库就可以连接到IBM db2。
观看以下视频,发现它非常有用:
https://youtu.be/PSNBDwgf9ts
您只需要请求库和db2凭据。为我工作。

答案 10 :(得分:0)

我在 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

到目前为止我能学到的就这么多。 希望对大家有帮助。

答案 11 :(得分:0)

# 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()