You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite3中切换单个或多个item_id的status字段状态?

批量切换多个item_id对应状态的纯SQLite实现

问题背景

现有方法可切换单个指定item_id对应的status字段布尔值:

def toggle_status_of_item(self, item_id: str):
    sql = """UPDATE table
             SET status = CASE status
                          WHEN 0 THEN 1 
                          ELSE 0 END
             WHERE item_id = ?"""
    self.cur.execute(sql, (item_id,))
    self.con.commit()

但item_id有时会传入多个值,目前通过循环逐个执行SQL的方式实现批量切换(如下),但希望使用纯SQLite语句完成批量操作,避免循环:

def toggle_status_of_item(self, item_ids: list):
    sql = """UPDATE table
            SET status = CASE status
                         WHEN 0 THEN 1 
                         ELSE 0 END
            WHERE item_id = ?"""
    for id in item_ids:
        self.cur.execute(sql, (id,))
    self.con.commit()

纯SQL解决方案

使用SQLite的IN操作符匹配多个item_id,同时动态生成对应数量的参数占位符,只需执行一次SQL即可完成批量状态切换:

def toggle_status_of_item(self, item_ids: list):
    # 根据列表长度生成对应数量的占位符,比如2个ID对应"?, ?"
    placeholders = ", ".join(["?"] * len(item_ids))
    sql = f"""UPDATE table
             SET status = CASE status
                          WHEN 0 THEN 1 
                          ELSE 0 END
             WHERE item_id IN ({placeholders})"""
    self.cur.execute(sql, item_ids)
    self.con.commit()

说明

  • IN ({placeholders})会被替换为IN (?, ?, ...)的格式,完美适配传入的item_ids列表
  • 单次执行SQL即可完成所有目标记录的状态翻转,相比循环执行效率更高,完全符合纯SQL批量操作的需求

内容的提问来源于stack exchange,提问作者Sun Bear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:07:19