Python和sqlite3:删除多行

mka*_*kam 3 python sqlite

我需要使用 SQL 语句从 sqlite3 表中删除多行,例如:

DELETE FROM table WHERE id IN (23, 19, 35, 16, 12, 78)
Run Code Online (Sandbox Code Playgroud)

我的问题是用 Python 进行编码,并将 ids 放在列表中。以下不起作用,会产生语法错误:

cursor.execute('DELETE FROM table WHERE id IN ?', (id_list,))
Run Code Online (Sandbox Code Playgroud)

我尝试将列表转换为元组,结果相同。请问正确的语法应该是什么?

编辑:当然,我不希望必须遍历列表来一一删除行,因为这会非常低效。

附言。管理员指出了这个问题与这个的相似之处。然而,这个问题是关于 DML 语句(删除),而那个问题是关于 DATA 语句(选择)。这种差异可能看起来很表面,但实际上很关键,因为 SQLITE3 允许将executemany命令与DML 语句一起使用,但不能与数据语句一起使用。因此,两个问题的答案是截然不同的。

zwe*_*wer 6

如果您需要自动将多个元素解包到 SQL 语句中,则不能仅将其作为列表传递 - 您必须实际考虑语句中的位置参数(即添加与?要解包的元素一样多的元素)。就像是:

id_list = (23, 19, 35, 16, 12, 78)
query = "DELETE FROM table WHERE id IN ({})".format(", ".join("?" * len(id_list)))
# DELETE FROM table WHERE id IN (?, ?, ?, ?, ?, ?)
cursor.execute(query, id_list)
Run Code Online (Sandbox Code Playgroud)

请记住,这可能不一定比通过以下方式发出多个语句更有效:

cursor.executemany("DELETE FROM table WHERE id = ?", id_list)
Run Code Online (Sandbox Code Playgroud)

这一切都取决于查询缓冲、表关系等。