在大批量查询结果的循环中,更新操作成本奇高

2024-09-29 17:15:31 发布

您现在位置:Python中文网/ 问答频道 /正文

当我查询大量的记录,然后循环结果。 如果我更新一个记录,会花费很多时间。在

_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查询每个记录

怎么回事?在


Tags: iddbtimesqlalchemysession记录时间query
1条回答
网友
1楼 · 发布于 2024-09-29 17:15:31

https://bitbucket.org/zzzeek/sqlalchemy/issue/3270/in-the-loop-of-large-quantity-query-result

我问SQLAlchemy的作者。 他给出了答案:

两种方法可以解决所花费的时间。在

  1. 打开对象的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会话在

  1. 在调用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提交

相关问题 更多 >

    热门问题