[英]Python sqlite3 string formatting
我有一个这样的功能:
def func(self, id):
self.cursor.execute("SELECT * FROM my_table WHERE id=?", (id,))
当我在id中传递整数值时,此方法有效:
obj.func(id=55)
现在,我可能想像这样重用此函数:
obj.func(id="associated_id")
其中,associated_id实际上是my_table中的第二列。 但是,这不起作用(即使存在id == associated_id的行,也找不到任何结果)。
如果我这样更改功能,它将起作用:
def func(self, id):
self.cursor.execute("SELECT * FROM my_table WHERE id=%s" % str(id))
为什么第一个版本不起作用? 有什么方法可以使用sqlite3.execute参数代替本地python字符串格式来解决此问题?
在第一种情况下,您正在执行参数绑定。 正确的是,sqlite库会将值55绑定到查询调用。 在第二种情况下,您不应使用参数绑定,因为sql等同于:
SELECT * FROM my_table WHERE id='associated_id'
因为绑定调用检测到您正在传递字符串,然后将其在内部像字符串一样对待。
当你做
"SELECT * FROM my_table WHERE id=%s" % str(id)
您无需进行参数绑定,而只需将SQL传递给sqlite。
有关参数绑定的一些文档:
“?” SQL中的in表示执行查询时要提供的值,例如“ 55”。
如果您通过“?”传递“ associated_id”,则它是表中列的名称。 占位符,那么它将被视为字符串。 数据库无法将其识别为列名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.