Python sqlite3字符串格式化

时间:2013-04-19 23:19:19

标签: python sqlite

我有这样的功能:

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字符串格式来解决这个问题?

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您正在进行参数绑定。哪个是正确的,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

答案 1 :(得分:0)

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

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