Python 在大量查询结果的循环中,更新操作花费了大量的时间
当我查询大量记录时,循环结果。 如果我更新一条记录,那将花费很多时间Python 在大量查询结果的循环中,更新操作花费了大量的时间,python,orm,flask,sqlalchemy,flask-sqlalchemy,Python,Orm,Flask,Sqlalchemy,Flask Sqlalchemy,当我查询大量记录时,循环结果。 如果我更新一条记录,那将花费很多时间 _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()
_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
输出:
0.242075920105
15.5323040485
16.6957418919
提交操作花费的时间比正常情况下多。
打开“SQLALCHEMY_ECHO”时,显示SQLALCHEMY按id查询每条记录
这是怎么发生的
我问炼金术的作者。
他回答说:
有两种方法可以解决所花费的时间
打开Python中的对象求值,查看它们是否符合条件:
s、 queryWxUser.filter\u byid=\u user.id.updatedictdata='M',synchronize\u session=False
文档:http://docs.sqlalchemy.org/en/rel_0_9/orm/query.html?highlight=query.updatesqlalchemy.orm.query.query.update.params.synchronize_会话
在调用update之前,不要使会话中的所有10000个对象过期,这表示为了使上述synchronize_session='Evatate'正常工作,它必须命中每个WxUser对象并计算它们的id,这需要从数据库重新加载它们:
session=Sessionexpire\u on\u commit=False
docs:http://docs.sqlalchemy.org/en/rel\u 0\u 9/orm/session.htmlcommitteing你是在问为什么sqlalchemy会更新每个记录吗?因为您正在查询foor循环中的每个WxUser并更新其性别。在您的例子中,您正在对数据库执行10001个查询。查询本身看起来非常慢。为什么不尝试一种更简单的方法,比如db.session.queryWxUser.limit10000.updatedictsex=WxUser.Sex.MALE,即使这样也需要很多时间。