SqlAlchemy,初始加载后深度加载

时间:2013-05-28 04:30:48

标签: sqlalchemy lazy-loading

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

例如,以下是伟大的:

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

有什么办法吗?

1 个答案:

答案 0 :(得分: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()

this section最后一部分的文档。

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