使用WHERE ___ IN ___语句

Pea*_*oto 3 python sql sqlite

我正在试图弄清楚如何正确使用WHERE _ IN _语句

定义:

c.execute('''CREATE TABLE IF NOT EXISTS tab (
    _id integer PRIMARY KEY AUTOINCREMENT,
    obj text NOT NULL
    ) ;''')
Run Code Online (Sandbox Code Playgroud)

我正在尝试做这样的事情:

list_of_vars=['foo','bar']
statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'"+"','".join(list_of_vars)+"'")
Run Code Online (Sandbox Code Playgroud)

或者,我也试过这个,直接评估上面的内容

statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'foo','bar'")
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 9 supplied
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误.当我这样做时,它可以工作,但不建议这样做,因为它容易受到SQL注入攻击.

statement="SELECT * FROM tab WHERE obj IN ("+"'"+"','".join(statement)+"'"+")
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

您需要创建足够的参数来匹配您的变量列表:

statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars)))
c.execute(statement, list_of_vars)
Run Code Online (Sandbox Code Playgroud)

请注意,您list_of_vars作为参数值列表传入.使用', '.join()我们生成?由逗号分隔的字符串,然后使用.format()它将其插入到语句中.

对于很长的变量列表,使用临时表来保存这些值可能更有效,然后JOIN对临时表而不是IN带有绑定参数的子句使用a .