【问题标题】:Python and sqlite3: deleting multiple rows [duplicate]Python和sqlite3:删除多行[重复]
【发布时间】:2018-09-24 12:13:03
【问题描述】:

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

DELETE FROM table WHERE id IN (23, 19, 35, 16, 12, 78)

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

cursor.execute('DELETE FROM table WHERE id IN ?', (id_list,))

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

编辑: 当然,我不希望必须遍历列表逐个删除行,因为那样会非常低效。

PS。管理员已指出此问题与this 的相似之处。但是,这个问题是关于 DML 语句(删除),而那个问题是关于 DATA 语句(选择)。区别可能看起来很表面,但实际上很关键,因为 SQLITE3 允许 executemany 命令用于 DML 语句,但不能用于数据语句。因此,这两个问题的答案大相径庭。

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    如果您需要自动将多个元素解包到 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)
    

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

    cursor.executemany("DELETE FROM table WHERE id = ?", id_list)
    

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

    【讨论】:

      【解决方案2】:

      cursor.execute("DELETE FROM rows WHERE ids IN (%s);", ', '.join(idsList));

      【讨论】:

      • 不,你不应该这样做。字符串格式化存在 SQL 注入风险。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      相关资源
      最近更新 更多