Python 中 SQLite3 的 WHERE 子句

3 投票
2 回答
8789 浏览
提问于 2025-04-18 04:54

最近我在用Python 3.3和SQLite3的时候遇到了一个问题。我创建了一个比较大的表,所以我就用一个小例子来说明:

CREATE TABLE X(omega TEXT, z TEXT, id INT);

现在,我在一个主脚本中用不同的函数来访问这个表。在其中一个函数里,我写了以下代码:

cur.execute("SELECT omega,z FROM X WHERE omega=?",Omega)

当我把Omega变量设置为一个字符的字符串时,这段代码运行得很好。但是,当我把字符数增加(比如说如果Omega='10')时,我就遇到了以下错误:

    cur.execute("SELECT omega,z FROM X WHERE omega=?",Omega)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 2 supplied.

不过,我找到了一种解决方法:

cur.execute("SELECT omega,z FROM X WHERE omega="+Omega)

但我想知道为什么这种方法有效,而使用问号的“正确”方法却不行。

提前谢谢你们!

2 个回答

5

根据这份文档execute()的第二个参数应该是一个元组。这里的意思是,绑定的参数使用了一种叫做“鸭子类型”的方式。简单来说,就是如果一个字符串看起来像元组,那么它就会被当作元组来处理。你可以通过把第二个参数改成一个元组来解决这个问题:

cur.execute("SELECT omega,z FROM X WHERE omega=?", (Omega,))
9
cur.execute("SELECT omega,z FROM X WHERE omega=?",(Omega,))

因为字符串是可以逐个字符遍历的,所以它会尝试把每个字母都绑定到一个问号上(比如它会把 cur.execute("SELECT omega,z FROM X WHERE omega=?",('1','0')) 看成是这样,而不是 cur.execute("SELECT omega,z FROM X WHERE omega=?",('10',)))。

如果你像这样指定,它就知道这个字符串是一个整体,绑定到那个问号上。

撰写回答