2

我有这样的功能:

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

4

2 回答 2

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

于 2013-04-20T00:17:26.697 回答
0

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

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

于 2013-04-20T00:11:35.450 回答