SQLAlchemy query.all()行为

时间:2016-10-26 14:45:21

标签: python-2.7 sqlalchemy flask-sqlalchemy

在我的SQLAlchemy应用程序中打开一些调试后我注意到的是这样的声明:

self.session.query(User).all()

似乎正在为表中的每一行运行一个查询。

即。

select * from user where id = 1

select * from user where id = 2

select * from user where id = n

我希望发布一个简单的select * from user。这个预期的行为或我的应用程序中配置不当的东西?

1 个答案:

答案 0 :(得分:0)

因此,事实证明它与事务范围和Flask_RESTPlus marshal_with装饰器有关。我基本上有这个:

@api.marshal_with(User)
def get(self):
    with transaction_scope(current_app.dbsession):
        return self.user_service.get_users(), 200

其中transaction_scope基本上限制了事务中与DB的交互。

然而,这导致装饰器试图在事务范围之外编组响应,因此它看到过时的对象并在处理它们时对它们进行重新水化,从而导致大量查询。

我把它更改为:

def get(self):
    with transaction_scope(current_app.dbsession):
        return api.marshal(self.user_service.get_users(), User), 200

解决了这个问题。

TL; DR - marshal_with装饰器在事务之外运行时会有一些意外行为。