当我查询大量的记录,然后循环结果。 如果我更新一个记录,会花费很多时间。在
_users = db.session.query(WxUser).limit(10000).all()
for _user in _users:
t1 = time()
db.session.query(WxUser).filter_by(id=_user.id).update(dict(sex=WxUser.Sex.MALE))
db.session.commit()
t2 = time()
print t2 - t1
输出:
^{pr2}$提交操作开销时间超过正常值。 当打开“SQLALCHEMY_ECHO”时,显示SQLALCHEMY按id查询每个记录
怎么回事?在
https://bitbucket.org/zzzeek/sqlalchemy/issue/3270/in-the-loop-of-large-quantity-query-result
我问SQLAlchemy的作者。 他给出了答案:
两种方法可以解决所花费的时间。在
打开对象的Python求值以查看它们是否符合条件:
s.query(WxUser).按(id)筛选=_用户id).update(dict(data='M'),synchronize\u session=False)
文档:http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html?突出显示=query.update#sqlalchemy.orm.query.query.update.params.synchronize\u会话在
在调用on update()之前,不要使会话中的所有10000个对象过期,这表示为了使上述synchronize_session='evaluate'正常工作,它必须命中每个WxUser对象并计算其“id”,这要求从数据库重新加载它们:
session=session(expire\u on_commit=False)
文档:http://docs.sqlalchemy.org/en/rel_0_9/orm/session.html提交
相关问题 更多 >
编程相关推荐