Python 如何在sqlite3中使用带参数的IN运算符?

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. 因此,我目前要做的是根据安装名称的长度准备一系列参数保持器: 乱七八糟(工作但丑陋) 在中,有

Python 3.5.2,stdlib sqlite3

我试图在
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)