Python 中 SQLite3 的 WHERE 子句
最近我在用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',))
)。
如果你像这样指定,它就知道这个字符串是一个整体,绑定到那个问号上。