SqlAlchemy ORM 预加载对象关系
我有一个树形结构的ORM(对象关系映射)关系,这个结构大概有4层深。默认情况下,它们不会被提前加载。现在我需要获取这个树的一个“副本”。所以我有这样的代码:
root = my_obj
for rel1 in root.some_relationship:
for rel2 in rel1.some_other_relationship:
... etc ...
显然,这是一个经典的问题:“每次都得去数据库加载每个关系”,这真是太慢了。我知道我可以通过一个实际的查询来加载root.some_relationship中的对象,使用subqueryload(http://docs.sqlalchemy.org/en/rel_0_9/orm/loading.html#sqlalchemy.orm.subqueryload),但是如果我已经有了root.some_relationship的引用,我能不能让这个对象提前加载一系列的子关系呢?
root.some_relationship.eagerload('some_other_relationship.yet_another_rel')
这就是我想要做的伪代码。
如果不行,而是通过查询来获取对象及其已经提前加载的关系,比如这样:
obj = session.query(root.some_rel_fk_id).subqueryload(....)
那这样做也是完全可以的。
非常感谢任何帮助!
1 个回答
2
在查询时加载数据是最好的(可能也是唯一的,但也不能说绝对不可能)方法。不过,你的查询示例是错误的。你需要在options
调用中指定加载数据:
root = session.query(MyModel
).options(subqueryload('my_rel').subqueryload('sub_rel'))