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()
答案 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]))