Python 如何在sqlite3中使用带参数的IN运算符?
Python 3.5.2,stdlib sqlite3 我试图在Python 如何在sqlite3中使用带参数的IN运算符?,python,sqlite,python-db-api,Python,Sqlite,Python Db Api,Python 3.5.2,stdlib sqlite3 我试图在WHERE子句中的in运算符中发出一个带有动态条件的SQL查询: 错误代码(不工作) installation\u names是一个元组,但是上面的操作显然不起作用,并且有一个错误 sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. 因此,我目前要做的是根据安装名称的长度准备一系列参数保持器: 乱七八糟(工作但丑陋) 在中,有
WHERE
子句中的in
运算符中发出一个带有动态条件的SQL查询:
错误代码(不工作)
installation\u names
是一个元组,但是上面的操作显然不起作用,并且有一个错误
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
因此,我目前要做的是根据安装名称的长度准备一系列参数保持器
:
乱七八糟(工作但丑陋)
在中,有没有合适的方法来参数化正确的
项而不是我的乱七八糟?我还没有在文档中找到任何东西。我认为没有比这个解决方案更好的了。您可以将列表转换为正则表达式,然后使用REGEXP
@Barmar,这是一个有趣的想法,唯一的额外含义是确保installation\u names
中的项正确转义,以达到REGEXP
的目的。re.escape()
就可以了。regexp实际上没有任何优势-您仍然需要生成它并确保它被转义,然后您就失去了计划员可以进行的优化:索引/哈希查找等。。。无论如何-你的第二个例子是做这件事的标准方法。。。除非你改用ORM。@JonClements,否则你应该把你的评论变成一个答案,这样我就可以“祝福”它,并为后代结束这个问题:)我认为没有比这个解决方案更好的了。您可以将列表转换为正则表达式,然后使用REGEXP
@Barmar,这是一个有趣的想法,唯一的额外含义是确保installation\u names
中的项正确转义,以达到REGEXP
的目的。re.escape()
就可以了。regexp实际上没有任何优势-您仍然需要生成它并确保它被转义,然后您就失去了计划员可以进行的优化:索引/哈希查找等。。。无论如何-你的第二个例子是做这件事的标准方法。。。除非你改用ORM。@JonClements,否则你应该把你的评论变成一个答案,这样我就可以“祝福”它,并为后代结束这个问题:)
sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type.
def top_item_counts_in_installations(cursor, installation_names):
param_holders= ",".join("?" for i in installation_names)
return cursor.execute(
"SELECT itm.name, COUNT(*)"
" FROM Installations ins INNER JOIN Items itm ON itm.id=ins.itmid"
" WHERE ins.name IN (%s)"
" GROUP BY itm.name"
" ORDER BY COUNT(*) DESC"
" LIMIT 3" % param_holders,
installation_names)