SqlAlchemy,初始加载后深度加载
是否可以在加载初始对象后启动深度加载 例如,以下几点很好:SqlAlchemy,初始加载后深度加载,sqlalchemy,lazy-loading,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.ba
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
foo=session.query(foo.first)()
如果foo.something:
什么都不做
其他:
#据我所知,您已经在做第一个示例中要求的事情了
session.query(Foo).options(joinedload('bars.bazs')).all()
这将仅加载要开始的Foo对象。只有在访问Foo.Bar属性时,才会加载所有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()
本文最后一部分中的文档
要研究单步执行代码时如何从DB加载对象,可以将echo=True
传递给create_engine()
调用。据我所知,您已经在执行第一个示例中要求的操作
session.query(Foo).options(joinedload('bars.bazs')).all()
这将仅加载要开始的Foo对象。只有在访问Foo.Bar属性时,才会加载所有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()
本文最后一部分中的文档
要研究在单步执行代码时如何从DB加载对象,可以将echo=True
传递给create_engine()
调用。Ah super,再次仔细阅读您引用的文档,行为清晰。Ah super,再次仔细阅读您引用的文档,行为清晰。