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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:47:24