SQLite3 WHERE子句在Python中

时间:2014-04-30 17:06:58

标签: python sqlite where-clause

刚刚遇到使用SQLite3运行python 3.3的问题。我创建了一个相当大的表,所以我只使用一个小例子:

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 个答案:

答案 0 :(得分:4)

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',))

如果你指定这样,它知道字符串是一个绑定到问号的项目

答案 1 :(得分:2)

根据this documentationexecute()的第二个参数应该是元组。据推测,绑定是使用duck-typing,因为字符串就像一个元组,它被视为一个。您可以通过将第二个参数更改为元组来解决此问题:

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