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,再次仔细阅读您引用的文档,行为清晰。