【问题标题】:What do SQL queries Parameterized with '%s' look like?使用“%s”参数化的 SQL 查询是什么样的?
【发布时间】:2016-10-10 06:06:04
【问题描述】:

考虑表单中的特定 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) 运行时,光标执行的查询的实际文本是什么?

【问题讨论】:

  • cursor.execute() 属于哪个框架?
  • 框架是MySQL
  • 这是使用Python API吗?
  • 没错,就是python API
  • 我对 Python 一无所知,但这不是参数化查询的正常工作方式。参数值单独发送到 MySQL,它们不会注入到 SQL 字符串中。因此,参数值永远不会导致语法错误(这就是重点)。

标签: python mysql sql


【解决方案1】:

如你所见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

【讨论】:

  • “当您使用 %s 时,它将将该值替换为参数列表中的值”的声明如何与 Álvaro 的评论相一致,即参数值不会注入 SQL 字符串?跨度>
  • @Someone_Else:它将转义序列以防止 SQL 注入。这就是为什么它的行为与简单的 .format 调用不同的原因。
  • 所以它就像一个 .format 调用,但它会自动转义它需要的字符?
  • @Everyone_Else 正如我所说,我不是 Python 编码器。参数化查询的实际实现可以使用不同的方法,从真正的服务器端绑定参数到客户端模拟。
【解决方案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)))

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2014-05-13
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多