Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大量查询结果的循环中,更新操作花费了大量的时间_Python_Orm_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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,即使这样也需要很多时间。