使用'%s'参数化的SQL查询是什么样的?

时间:2016-06-09 14:14:19

标签: python mysql sql

考虑

形式的特定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)时,光标执行的查询的实际文本是什么?

2 个答案:

答案 0 :(得分:2)

您可以阅读here

  

语法:

     

cursor.execute(operation, params=None, multi=False)

     

iterator = cursor.execute(operation, params=None, multi=True)

     

此方法执行给定的数据库操作(查询或命令)。   在元组或字典参数中找到的参数是绑定的   操作中的变量。 使用%s%(name)s指定变量   参数样式(即使用格式或 pyformat样式)。 execute()   如果multiTrue,则返回迭代器。

因此,当您使用%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)

source

答案 1 :(得分:2)

您的string实际上是参数化查询,您应该在其中传递元素以匹配%s

您可以在mySql documentation

中获取示例

请注意,数组中的参数不是,而是元组中的参数。

你的例子变成了:

    cursor.execute("INSERT INTO tablename(col_one, col_two, col_three) VALUES (%s,%s,%s)", ('text', 123, datetime.time(12,0)))

我还将您的"更改为'因为我怀疑它太喜欢了。

我也不确定日期格式,如果仍有问题,请尝试没有日期(如果需要,请修改日期格式)。