如何在Sqlite3中有时切换一个,有时切换多个项目?

xzlaal3s  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(110)
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的列status中的布尔值。然而,item_id有时可以是复数,即它可能包含多个值,我无法控制这些值。
我应该如何重写sqlite3文档字符串来切换有时一个,有时多个item_id?除了将item_id: str更改为item_id: list之外,如何编写SQLite命令以将CASE语句应用于项目ID列表?先谢谢你了。
下面的方法会做我想要的。但是,它不是一个纯粹的SQLITE方法。我想知道下面的SQL命令的实现.

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()
2uluyalo

2uluyalo1#

(假设item_id使用逗号(,)来区分应该运行此查询的不同item_ids。)
创建item_id s的List[Tuple],然后使用cur.executemany()

def toggle_status_of_item(self, item_id: str):
    item_ids = list(map(lambda x: (x,), item_id.split(",")))
    sql = """UPDATE table
             SET status = CASE status
                          WHEN 0 THEN 1 
                          ELSE 0 END
             WHERE item_id = ?"""
    self.cur.executemany(sql, item_ids)
    self.con.commit()
qco9c6ql

qco9c6ql2#

感谢@esqew,我学到了:

  1. item_ids必须是元组的列表,其中每个元组包含str元素,例如item_ids = [("A",), ("B",), ("C",)]
    1.我可以使用sqlite的.executemany()来复制python for循环的功能。
    工作溶液:
def toggle_status_of_items(self, item_ids: list):
    sql = """UPDATE table
            SET status = CASE status
                         WHEN 0 THEN 1 
                         ELSE 0 END
            WHERE item_id = ?"""
    self.cur.executemany(sql, item_ids)
    self.con.commit()

并且该方法可以被执行为:

item_ids = [("A",), ("B",), ("C",)]
class_instance_name.toggle_status_of_items(item_ids)

相关问题