ibm_db_dbi连接到DB2执行sql语句

时间:2017-06-22 07:15:02

标签: python db2

Python3.5是正常的,但Python2.7会将此错误提升

  

ibm_db_dbi.Error:ibm_db_dbi ::错误:处理语句时出错

这是我的代码

import ibm_db_dbi

def Conn_DB():
    global cur, conn
    database = "test"
    hostname = "127.0.0.1"
    port = 50000
    user = "test"
    passwd = "test"
    conn = ibm_db_dbi.connect(
    "DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s" % (database, hostname, port, user, passwd), "",
    "")  
    conn.set_autocommit(True)
    cur = conn.cursor()
    return conn, cur

def main():

    Conn_DB()
    global cur
    obj = ["1.1.1.1"]
    fw_ip = ["3.3.3.3"]
    cur.execute("select 1 from TEST where IP='%s' and firewall='%s'" % (obj,fw_ip))
    if cur.fetchone():
         print('hello, world')

if __name__ == '__main__':
main()

1 个答案:

答案 0 :(得分:0)

基本上,您使用模运算符%在字符串插值中传递单项列表而不是标量值。因此,引发了长度问题,您可以通过打印出连接的SQL字符串来查看,该字符串显示带有未闭合引号的无效查询:

print("select 1 from TEST where IP='%s' and firewall='%s'" % (obj, fw_ip))

# select 1 from TEST where IP='['1.1.1.1']' and firewall='['3.3.3.3']'

有趣的是,正如你所指出的,这不会在Python 3中失败,而是在Python 2中失败。要解决,只需索引第一项或不将括号[]分配给 obj 和< em> fw_ip 将它们呈现为一个列表。

obj = ["1.1.1.1"]
fw_ip = ["3.3.3.3"]

cur.execute("select 1 from TEST where IP='%s' and firewall='%s'" % (obj[0], fw_ip[0]))

但是,在最佳实践中,使用带有cur.execute() params 参数的参数,这些参数需要一个序列,例如元组或列表,但使用不带引号的位置标记?调整SQL字符串:

cur.execute("select 1 from TEST where IP = ? and firewall = ?", (obj[0], fw_ip[0]))