考虑一个特定的SQL查询,形式如下
cursor.execute(string, array)
其中字符串是包含'%s'
的字符串,数组是满足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)
时,游标执行的查询的实际文本是什么?
正如你可以在这里读到的:
语法:
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)
源
您的string
实际上是您的参数化查询,您应该在其中传递元素以匹配您的%s
。
您可以在 mySql 文档中获取示例
请注意,参数不在数组中,而是在元组中。
您的示例变为:
cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)", ('text', 123, datetime.time(12,0)))
我还把你的"
改成了'
,因为我怀疑它太喜欢了。
我也从不确定日期格式,如果您仍然遇到问题,请尝试没有日期(然后根据需要修复日期格式)。