Python 中的 SQLite3 WHERE 子句

Tra*_*dez 2 python sqlite where-clause

就在最近使用 SQLite3 运行 python 3.3 时遇到了问题。我已经创建了一个相当大的表,所以我将只使用一个小例子:

CREATE TABLE X(omega TEXT, z TEXT, id INT);
Run Code Online (Sandbox Code Playgroud)

现在,我使用各种函数从主脚本访问该表。在其中一个功能中,我有代码:

cur.execute("SELECT omega,z FROM X WHERE omega=?",Omega)
Run Code Online (Sandbox Code Playgroud)

当我将 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.
Run Code Online (Sandbox Code Playgroud)

现在,我找到了一个解决方法:

cur.execute("SELECT omega,z FROM X WHERE omega="+Omega)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Jor*_*ley 6

cur.execute("SELECT omega,z FROM X WHERE omega=?",(Omega,))
Run Code Online (Sandbox Code Playgroud)

由于字符串是可迭代的,它会尝试将每个字母绑定到 ? (例如,它看到cur.execute("SELECT omega,z FROM X WHERE omega=?",('1','0'))而不是cur.execute("SELECT omega,z FROM X WHERE omega=?",('10',))

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


Rei*_*ica 5

根据此文档,第二个参数execute()应该是一个元组。据推测,绑定正在使用鸭子类型,并且由于字符串的作用类似于元组,因此它会被视为元组。您可以通过将第二个参数更改为元组来解决此问题:

cur.execute("SELECT omega,z FROM X WHERE omega=?", (Omega,))
Run Code Online (Sandbox Code Playgroud)