Peewee:如何在for循环中仅更新单条记录?
问题解决:循环中更新单条Line记录而非全表
问题出在你调用line.update().execute()的方式上,在Peewee ORM中,直接对模型实例调用update()会生成不带过滤条件的更新语句,导致全表更新。以下是两种正确的实现方式:
方法1:使用实例的save()方法(推荐)
既然你已经从数据库中获取到了line实例,直接修改实例属性后调用save()即可,该方法只会更新当前实例对应的记录:
with db.atomic(): lines = list(Line.select().where(Line.document_no == counter+5000)) entries = [] for line in lines: entries.append(Entry(posting_date=dtime.today(), item_no=line.item_no, quantity=line.ordered_quantity)) # 修改实例属性并保存 line.quantity = line.ordered_quantity line.received = True line.save() Entry.bulk_create(entries)
方法2:在update()中添加过滤条件
如果坚持要用update()方法,必须通过where()指定当前记录的主键(或唯一标识),确保只更新目标记录:
with db.atomic(): lines = list(Line.select().where(Line.document_no == counter+5000)) entries = [] for line in lines: entries.append(Entry(posting_date=dtime.today(), item_no=line.item_no, quantity=line.ordered_quantity)) # 用主键过滤,仅更新当前line Line.update(quantity=line.ordered_quantity, received=True).where(Line.id == line.id).execute() Entry.bulk_create(entries)
补充优化:批量更新提升效率
如果你的场景允许,也可以先收集所有需要更新的Line主键,再一次性执行批量更新,避免循环中多次操作数据库:
with db.atomic(): lines = list(Line.select().where(Line.document_no == counter+5000)) entries = [] line_ids = [] for line in lines: entries.append(Entry(posting_date=dtime.today(), item_no=line.item_no, quantity=line.ordered_quantity)) line_ids.append(line.id) # 批量更新符合条件的记录 Line.update(quantity=Line.ordered_quantity, received=True).where(Line.id.in_(line_ids)).execute() Entry.bulk_create(entries)
内容的提问来源于stack exchange,提问作者Greex
相关产品推荐
相关产品推荐

