使用WHERE ___ IN ___语句

我想弄清楚如何正确使用WHERE _ IN _语句

定义:

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

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

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

或者,我也试过这个,直接评估到上面

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

我得到的错误是:

 sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 9 supplied 

这是给我一个错误。 当我这样做,它的工作原理,但不build议这样做,因为它容易受到SQL注入攻击。

 statement="SELECT * FROM tab WHERE obj IN ("+"'"+"','".join(statement)+"'"+") 

您需要创build足够的参数来匹配您的variables列表:

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

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

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