我需要使用 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 语句一起使用,但不能与数据语句一起使用。因此,两个问题的答案是截然不同的。
如果您需要自动将多个元素解包到 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)
这一切都取决于查询缓冲、表关系等。
| 归档时间: |
|
| 查看次数: |
6054 次 |
| 最近记录: |