SqlAlchemy ORM渴望加载对象的关系

时间:2014-08-20 14:15:25

标签: python orm sqlalchemy flask-sqlalchemy

我有一个ORM关系的树形结构(比如说)4级深度。默认情况下,它们并不急于加载。我处在需要获得树的“副本”的情况下。所以我有类似的东西:

root = my_obj
for rel1 in root.some_relationship:
    for rel2 in rel1.some_other_relationship:
        ... etc ...

所以,显然,这是经典的“必须去数据库来加载每个关系”的问题,而且这是永远的。我知道我可以用rootqueryload(http://docs.sqlalchemy.org/en/rel_0_9/orm/loading.html#sqlalchemy.orm.subqueryload)在root.some_relationship中加载对象来实际查询,但如果我已经有了root.some_relationship的句柄,我可以告诉该对象急切加载一个列表subrelationships?

root.some_relationship.eagerload('some_other_relationship.yet_another_rel')

将是我正在尝试做的伪代码。

如果没有,并且获取具有关系的对象的查询已经如此加载:

obj = session.query(root.some_rel_fk_id).subqueryload(....)

是最好的方式,那就太酷了。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

在查询时加载是最好的(可能只是,但永远不会说从不)这样做的方式。但是,您的查询示例是错误的。您可以在options调用中指定加载:

root = session.query(MyModel
).options(subqueryload('my_rel').subqueryload('sub_rel'))