2016-10-26 24 views
0

什么我打开我的SQLAlchemy的应用中的一些调试后注意到,就是这样一个说法:SQLAlchemy的query.all()行为

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

这不是预期的。请张贴您的模型配置。 – univerio

+0

同意。绝对没有预料到。潜在的延迟加载关系的问题 – dizzyf

回答

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基本上作用域的交易与数据库的交互。

但是,这导致修饰器尝试编组响应超出事务范围,因此它看到了过时的对象,并在处理它们时对其进行了补水处理,从而导致无数查询。

我改成了这样:

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

这解决了这个问题。

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