繁体   English   中英

Python sqlite3字符串格式

[英]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。

有关参数绑定的一些文档:

http://www.sqlite.org/c3ref/bind_blob.html

“?” SQL中的in表示执行查询时要提供的值,例如“ 55”。

如果您通过“?”传递“ associated_id”,则它是表中列的名称。 占位符,那么它将被视为字符串。 数据库无法将其识别为列名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM