Skip to main content
 首页 » 编程设计

Python sqlite3 字符串格式化

2025年05月04日9yjmyzz

我有这样一个函数:

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 参数而不是 native python 字符串格式来解决这个问题?

请您参考如下方法:

在第一种情况下,您正在进行参数绑定(bind)。这是正确的,sqlite 库会将值 55 绑定(bind)到查询调用。在第二种情况下,您不应使用参数绑定(bind),因为 sql 将等同于:

SELECT * FROM my_table WHERE id='associated_id' 

因为绑定(bind)调用检测到您正在传递一个字符串,然后它在内部将其视为一个字符串。

当你这样做的时候

"SELECT * FROM my_table WHERE id=%s" % str(id) 

您不进行参数绑定(bind),而只是将 SQL 原样传递给 sqlite。

关于参数绑定(bind)的一些文档:

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