SqlAlchemy ORM 预加载对象关系

0 投票
1 回答
2738 浏览
提问于 2025-04-18 17:55

我有一个树形结构的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'))

撰写回答