是否可以在加载初始对象后启动深度预加载?
例如,以下是伟大的:
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
有什么办法吗?
答案 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()
来电。