刚刚遇到使用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)
但我想知道为什么会这样,而使用问号的“正确”方法则不然。
提前致谢!
答案 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 documentation,execute()
的第二个参数应该是元组。据推测,绑定是使用duck-typing,因为字符串就像一个元组,它被视为一个。您可以通过将第二个参数更改为元组来解决此问题:
cur.execute("SELECT omega,z FROM X WHERE omega=?", (Omega,))