我正在试图弄清楚如何正确使用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
这给了我一个错误.当我这样做时,它可以工作,但不建议这样做,因为它容易受到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)
请注意,您将list_of_vars作为参数值列表传递.使用’,’.join()我们生成一个字符串?用逗号分隔的字符,然后使用.format()将其插入到语句中.
对于很长的变量列表,使用临时表来保存这些值可能更有效,然后对临时表使用JOIN而不是使用绑定参数的IN子句.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。