使用 Python 连接到 db2 数据库

问题描述 投票:0回答:3

我正在开发一个需要连接到 ibm db2 数据库的应用程序。使用 DBeaver 我可以成功连接到数据库(我向他提供了 db2cc.jardb2cc4.jar 文件)。

在我看来,DBeaver 正在使用我的 Window 凭据登录,因为我不需要输入任何登录名或密码即可连接。

现在,我一直在尝试使用 python 3.7 和 pypi 最新版本的 ibm_db 包连接到同一个数据库。我没有安装任何其他东西。

import ibm_db

# ...
connection_string = "DATABASE=" + self.params['schema'] + ";" + \
                                         "HOSTNAME=" + self.params['host'] + ";" + \
                                         "PORT=" + self.params['port'] + ";" + \
                                         "PROTOCOL=TCPIP;" + \
                                         "SECURITYMECHANISM=4;" + \
                                         "UID=" + self.params['user'] + ";" + \
                                         "PWD=" + self.params['password'] + ";"


try:
    self.connection = ibm_db.connect(connection_string, "", "")
    # ...

在参数中使用我的 Windows 凭据,我收到以下错误消息:

Connection error
Bad credentials
SQLCODE=-30082
08001

根据我在堆栈溢出上看到的连接到 db2 数据库的内容很复杂......

有人知道如何连接吗?使用 Windows 凭据或其他方式...

谢谢!

python db2
3个回答
1
投票

Db2 适用于 Python,即 cpython。

在开始之前,您需要了解一些基础知识,例如:

  • 什么操作系统运行目标 Db2 数据库(Z/OS、i 系列、Linux/Unix/Windows/cloud)和
  • 正在使用哪种客户端(java、odbc/cli、.net 等),以及
  • 数据库有什么样的身份验证/加密 (ssl、基于服务器的身份验证/+/-/加密等)。
  • 是远程数据库rdbms Apache DERBY或者Db2。

在开始之前了解这些基础知识。您必须与运行 Db2 服务器的人员交谈。如果你的目标数据库在云上的 Db2 上,那么

注意:在您的问题中,您提到 (

SecurityMechanism=4
) 即 com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY - 这对于非 JAVA 客户端不相关,如果数据库管理器是 DERBY 则相关

对于python,ibm_db包不是java应用程序,它是用'c'编程语言编写的python扩展。事实上,python ibm_db 扩展是底层 CLI 驱动程序 的包装器(它完成与数据库通信的实际工作)。

DBeaver 是一个 java 应用程序(因此它使用专门用于 java 的驱动程序,例如它使用

db2jcc.jar
或更典型的
db2jcc4.jar
和许可证文件来连接到远程数据库,用于某些平台)。

当 Db2 数据库在 Microsoft-Windows 服务器上运行时,或者当 Db2-服务器配置为与 Microsoft Active-Directory 集成时,您只能使用您的 Microsof-Windows 凭据连接到 Db2 数据库,这些凭据也适用于运行 Db2 服务器或 Active-Directory 的主机名。

对于任何其他组合(Db2 客户端操作系统和 Db2 服务器操作系统),服务器管理员(或安全人员)必须向您颁发适用于目标数据库服务器环境的用户标识/密码。

ibm_db 包需要安装 Db2 客户端,默认情况下它将自动安装 IBM 的 clidriver 包,除非您明确告诉安装程序不要进行该安装。

Db2-client 也可以在 python 之前单独安装,如果您愿意,在这种情况下,您必须告诉 Python 安装程序不要安装 clidriver,方法是在安装 ibm_db 之前设置环境变量 IBM_DB_HOME,如 readme 中所述。通常,您会为 Python 重新使用预先存在的 Db2 客户端的原因是,您现有的 Db2 客户端已经配置了数据库的 ODBC 数据源名称 (DSN) 以及可能需要的任何许可证。在那种情况下,python ibm_db 无需重新配置即可重用。

IBM 提供不同类型的 Db2-client,具体取决于运行 Db2-server 的操作系统以及您的 Db2-client 需要具备多少功能。至少有两家其他非 IBM 公司为 Db2 客户端提供 ODBC 驱动程序。

如果您的远程 Db2 服务器在 Linux、Unix、Windows 或 Z/OS 上运行,那么您可以使用“IBM Data Server Runtime Client”,您可以从 IBM 的 passport advantage 网站下载,或者从您的内部 IT 人员处获取。

如果您的 Db2 服务器在 i 系列 (AS/400) 上运行,您应该从 i 系列管理员那里获取它的驱动程序(包

IBM i access
可通过 ODBC 选项获得)。

对于 Z/OS 目标或 i 系列目标,您还需要一个许可证文件(需要花钱)并且您应该从您的管理员那里获得该文件,除非您的公司使用名为 Db2-connect 的网关产品,在这种情况下您不需要您的工作站上不需要单独的许可证文件。


0
投票

尝试以下连接字符串,如果您的 db2 客户端和服务器在同一主机上。 根据您的情况更改“mydb”和“DB2”(db2 实例名称,您可以使用 db2ilist 实用程序获取它)常量。

ibm_db.connect('DATABASE=mydb;Instance=DB2;PROTOCOL=IPC;', '', '')

0
投票

添加 ibm_db 库并在 .py 文件的顶部导入 ibm_db。

def get_db_connection():
    """
This will help to get db2 connection for query execution
    :return: conn
    """
    dsn_driver = "{IBM DB2 ODBC DRIVER}"
    dsn_database = "BLUDB"
    dsn_hostname = "your_hostname"
    dsn_port = "50000"
    dsn_protocol = "TCPIP"
    dsn_uid = "your_userid"
    dsn_pwd = "your_pwd"
    dsn = (
        "DRIVER={0};"
        "DATABASE={1};"
        "HOSTNAME={2};"
        "PORT={3};"
        "PROTOCOL={4};"
        "UID={5};"
        "PWD={6};").format(dsn_driver, dsn_database, dsn_hostname, dsn_port, dsn_protocol, dsn_uid, dsn_pwd)
    try:
        conn = ibm_db.connect(dsn, "", "")
        print("Connected!")
        return conn
    except Exception:
        print("\nERROR: Unable to connect to the \'" + dsn_database + "\' server.")
        print("error: ", ibm_db.conn_errormsg())
        exit(-1)

函数 get_db_connection() 将返回连接对象。在该连接对象上,您可以执行如下操作:

conn = get_db_connection()
list_results = []
select_query = 'SELECT  a.STATUS,  a.ID  FROM  "TABLE_NAME" AS a'
print(select_query)
selectStmt = ibm_db.exec_immediate(conn, select_query)
while ibm_db.fetch_row(selectStmt) != False:
    list_results.append(ibm_db.result(selectStmt, 'ID'))
ibm_db.close(conn)
© www.soinside.com 2019 - 2024. All rights reserved.