1

加载初始对象后是否可以启动深度渴望加载?

例如,以下内容很棒:

session.query(Foo).options(joinedload('bars.bazs')).all()

但是,如果我已经有了foo呢?

foo = session.query(Foo).first()
if foo.something:
    do_nothing()
else:
    # <- would now like to eagerload 'bars.bazs'
    for bar in foo.bars:
        for baz in bar.bazs:
            # this is lazily loaded and slow

有什么办法可以做到这一点?

4

1 回答 1

1

据我所知,您已经在执行您在第一个示例中要求的操作。

session.query(Foo).options(joinedload('bars.bazs')).all()

这只会加载 Foo 对象开始。只有当您访问 Foo.bars 属性时,它才会加载所有 Bar 对象和所有 Bar 对象的所有 Baz 对象。

如果您想使用初始查询预先加载所有 Foo、Bar 和 Baz 对象,您必须像这样指定它:

session.query(Foo).options(joinedload('bars'), joinedload('bars.bazs')).all()

或更短:

session.query(Foo).options(joinedload_all('bars.bazs')).all()

本节最后部分的文档。

要调查在单步执行代码时如何从数据库加载对象,您可以传递echo=True给您的create_engine()调用。

于 2013-05-29T09:25:32.763 回答