我有一个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(....)
是最好的方式,那就太酷了。
非常感谢您的帮助!
答案 0 :(得分:2)
在查询时加载是最好的(可能只是,但永远不会说从不)这样做的方式。但是,您的查询示例是错误的。您可以在options
调用中指定加载:
root = session.query(MyModel
).options(subqueryload('my_rel').subqueryload('sub_rel'))