我在表中有12000个项目,我想单独更新和提交每个项目。
items = db.session.query(User).all()
for item in items:
item.active = 0
# do stuff
db.session.commit()
我需要提交每次迭代,以便更改立即转到数据库。如果我在第一个查询中选择所有行,则提交速度很慢。如果我选择较小的数据集(例如400行),则速度很快。
如果不选择较小的数据集,我应该怎样做才能获得更好的性能?
答案 0 :(得分:1)
SQLAlchemy在内部缓存所有查询的项目,但在发出commit
时使该缓存过期。因此,在下一次迭代中访问的实例位于"过期" state和SQLAlchemy重新查询数据库。所以你有效地做了:
当您第一次选择400时,您所看到的差异仅仅是规模的影响:您只需要经过三分之一的选择/提交周期。
没有记录的方法来阻止过期机制的发生。您可以忍受制作24000个查询,也可以在最后提交一次。
在一次大型交易中,只需在循环之后提交就可能会更好。