考虑
形式的特定SQL查询cursor.execute(string, array)
其中string是包含'%s'
的字符串,array是满足len(array) == string.count("%s")
的数组,不一定只包含字符串。
例如:
cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)",("text", 123, datetime.time(12,0)))
当我运行此命令时,我收到一条无用的错误消息,指出“您的SQL语法中有错误...”,然后是查询的部分文本。但是,为了调试这个,我想知道查询的全文。
当运行查询cursor.execute(string, array)
时,光标执行的查询的实际文本是什么?
答案 0 :(得分:2)
您可以阅读here:
语法:
cursor.execute(operation, params=None, multi=False)
iterator = cursor.execute(operation, params=None, multi=True)
此方法执行给定的数据库操作(查询或命令)。 在元组或字典参数中找到的参数是绑定的 操作中的变量。 使用
%s
或%(name)s
指定变量 参数样式(即使用格式或 pyformat样式)。execute()
如果multi
为True
,则返回迭代器。
因此,当您使用%s
时,它会将该值替换为params
列表中的值。
如果您要调试语句,可以使用以下代码打印上次执行的查询:cursor._last_executed
:
try:
cursor.execute(sql, (arg1, arg2))
connection.commit()
except:
print("Error: "+cursor._last_executed)
raise
finally :
print(cursor._last_executed)
答案 1 :(得分:2)
您的string
实际上是参数化查询,您应该在其中传递元素以匹配%s
。
请注意,数组中的参数不是,而是元组中的参数。
你的例子变成了:
cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)", ('text', 123, datetime.time(12,0)))
我还将您的"
更改为'
因为我怀疑它太喜欢了。
我也不确定日期格式,如果仍有问题,请尝试没有日期(如果需要,请修改日期格式)。