Python 使用WHERE _____;语句

Python 使用WHERE _____;语句,python,sql,sqlite,Python,Sql,Sqlite,我想知道如何正确地使用WHERE uuin uuu语句 定义: 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(

我想知道如何正确地使用WHERE uuin uuu语句

定义:

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
这给了我一个错误。当我这样做时,它可以工作,但不建议这样做,因为它容易受到SQL注入攻击

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

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

statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars)))
c.execute(statement, list_of_vars)
请注意,您可以将变量列表作为参数值列表传入。使用“,”.join我们生成了一个字符串?用逗号分隔的字符,然后使用.format将其插入语句中


对于一个长的变量列表,使用临时表保存这些值,然后对临时表使用联接,而不是使用带有bind参数的IN子句,可能更有效。

+1。但是为什么不仅仅是“?”*lenlist\u of_vars而不是生成器表达式?@abarnet:一点天赋?我计划对它计时,看看它除了个人触摸之外是否还有其他用途,但我一时心烦意乱。好吧,这适用于简单的测试用例,但不是我正在做的更高级的测试用例。。。叹气不过,这是向前迈出的一步@Martijn Pieters:我们不要求我们的员工穿37件衣服。@abarnert:很快,后来我把它换成了.join['?'*lenlist\u of u vars],因为在.join中使用列表比生成器快。天赋就这么多!