如何使用Python为SQLite3现有表的对应行批量更新指定列数据
正确实现方案
核心思路
你之前的两次错误分别是误用了INSERT(新增行而非修改已有行)、UPDATE未加匹配条件(全表覆盖更新),要实现一一对应填充,需要把name和对应的fruit绑定为参数,更新时通过WHERE条件匹配对应行。
具体实现步骤
方法1:手动指定fruit和name的对应关系(推荐,匹配关系更可控)
直接构造包含「对应name、匹配fruit」的参数列表,执行带WHERE条件的UPDATE语句即可:
# 参数顺序为 (要设置的name, 匹配的fruit) my_list = [("John", "apple"), ("Jack", "banana"), ("Joe", "peach")] cursor.executemany("UPDATE fruit_table SET name = ? WHERE fruit = ?", my_list) # 记得提交变更 conn.commit()
方法2:按原有行顺序自动匹配(适合不需要手动指定对应关系的场景)
如果只要按现有fruit行的顺序依次填充name,可以先查询出所有fruit的列表,再和name列表拼接为参数:
# 先按行顺序查询所有已有fruit cursor.execute("SELECT fruit FROM fruit_table ORDER BY rowid") fruits = [item[0] for item in cursor.fetchall()] # 按顺序拼接name和fruit names = ["John", "Jack", "Joe"] my_list = list(zip(names, fruits)) # 执行更新 cursor.executemany("UPDATE fruit_table SET name = ? WHERE fruit = ?", my_list) conn.commit()
原错误原因说明
- 第一次使用
INSERT语句:SQL中INSERT的作用是新增数据行,不会修改原有行,因此会新增fruit字段为NULL的行,原有行的name保持NULL - 第二次使用无WHERE的
UPDATE语句:不带WHERE条件的UPDATE会更新全表所有行,executemany会依次执行三次更新,前两次的结果会被最后一次覆盖,因此所有行的name最终都变成列表最后一个值Joe
内容的提问来源于stack exchange,提问作者Couch Tomato
相关产品推荐
相关产品推荐

