我使用以下位来使用字典
中的键:值创建sql语句。record_number = 627
temp_dict = {
"FOO": 752,
"BAR": "test",
"I": "zzzzz",
"Hate": "tesname",
"SQL": "testsomethingesle",
"SO": "commentlol",
"MCUH": "asadsa",
"FILLING": "zzzzzz",
"NAME": "''",
}
update_query = (
"UPDATE table_name SET {}".format(
", ".join("{} = '?'".format(k) for k in temp_dict)
)
+ " WHERE RECNUM = '"
+ record_number
+ "';"
)
update_values = tuple(temp_dict.values())
cur.execute(update_query, update_values)
update_query正确输出
UPDATE table_name SET FOO = '?', BAR = '?', I = '?', Hate = '?', SQL = '?', SO = '?', MCUH = '?', FILLING = '?', NAME = '?' WHERE RECNUM = '627';
和update_values也看起来正确
(752, 'test', 'zzzzz', 'tesname', 'testsomethingesle', 'commentlol', 'asadsa', 'zzzzzz', "''")
,但我得到以下错误firebirdsql.OperationalError: conversion error from string "?"
我的理解是?基本上是一个占位符值,如果我把一个元组或列表作为第二个参数在cur.execute()它应该取代?使用传入的值。我做错了什么?
生成的语句具有带问号的字符串字面值('?'
),而不是用作参数占位符的问号(普通?
)。这意味着当您执行语句时,您试图将文字值?
分配给列,如果该列不是CHAR、VARCHAR或BLOB,则会产生错误,因为没有从字符串?
到其他数据类型的有效转换。
您需要使用"{} = ?"
代替(注意问号周围没有单引号)。