使用Python连接到db2数据库

时间:2018-12-19 15:20:59

标签: python db2

我正在开发一个需要连接到ibm db2数据库的应用程序。使用DBeaver,我可以成功连接到数据库(我为他提供了 db2cc.jar db2cc4.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凭据还是其他方式...

谢谢!

3 个答案:

答案 0 :(得分:0)

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

[[1]]
    value weight
 56.75139      1

[[2]]
    value weight
 61.18781      1

[[3]]
    value weight
 56.75139      1

[[4]]
    value weight
 61.18781      1

答案 1 :(得分:0)

Db2在Python上可以正常工作。

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

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

在开始之前请先了解这些基础知识。您必须与运行Db2服务器的人员交谈。

注意:在您的问题中,您提到(SecurityMechanism=4)com.ibm.db2.jcc.DB2BaseDataSource.USER_ONLY_SECURITY-这与非Java客户端无关,与数据库管理器为DERBY相关。 / p>

对于python,ibm_db软件包不是Java应用程序。

DBeaver是一个Java应用程序(因此它使用db2jcc.jar或db2jcc4.jar和许可证文件来连接到远程数据库)。

当该Db2数据库在Microsoft-Windows上运行并且该凭据在运行Db2服务器的主机名上起作用时,您只能使用Windows凭据来连接到Db2数据库。对于任何其他组合,管理员必须向您颁发与目标主机名相关的用户ID /密码。

ibm_db软件包需要安装Db2-client。 Db2-client是一个单独的可安装文件。 different kinds of Db2-client取决于运行您的Db2服务器的操作系统以及您的Db2客户端需要具备的功能。如果您的远程Db2服务器在Linux,Unix,Windows或Z / OS上运行,则可以使用“ IBM数据服务器运行时客户端”,您可以从IBM的护照优势网站下载该文件,也可以从内部IT人士那里获取。如果Db2服务器在i系列(AS / 400)上运行,则应从i系列管理员那里获取其驱动程序。对于Z / OS或i系列,您将另外需要一个许可证文件(这需要花钱),并且您应该从管理员那里获取许可证文件,除非您的公司使用称为Db2-connect的网关产品,在这种情况下,您不需要工作站上的单独许可证文件。

答案 2 :(得分:0)

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

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)

function 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)