在我的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
。这个预期的行为或我的应用程序中配置不当的东西?
答案 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装饰器在事务之外运行时会有一些意外行为。