在contains_eager()中指定具有继承层次结构的实体的完整路径

jd.*_*jd. 7 python sqlalchemy

我有一个查询

(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1)))
Run Code Online (Sandbox Code Playgroud)

事情到目前为止工作.

我想要急切加载Related1.related2,我试过这个:

(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1))
    .outerjoin(Related1.related2).options(contains_eager(Related1.related2)))
Run Code Online (Sandbox Code Playgroud)

但它不起作用:

sqlalchemy.exc.ArgumentError:在此Query中指定的任何实体上找不到属性"related2".请注意,必须指定从根(Mapper | Root | root)到目标实体的完整路径.

鉴于related1通过子类与根实体相关,我没有看到如何指定完整路径.

我也试过了

(session.query(Root).with_polymorphic('*')
    .outerjoin(Subclass.related1).options(contains_eager(Subclass.related1))
    .outerjoin(Related1.related2).options(contains_eager('related1.related2')))
Run Code Online (Sandbox Code Playgroud)

可以预见的是失败了

sqlalchemy.exc.ArgumentError:在此Query中的映射实体Mapper | Root | root上找不到名为'related1'的属性.

如何指定间接相关实体的完整路径contains_eager()

zzz*_*eek 11

contains_eager需要查询所知实体的完整路径:

contains_eager(Subclass.related1, Related1.related2)
Run Code Online (Sandbox Code Playgroud)

  • 近十年后,您的回答帮助我解决了异步 sqlalchemy 会话的问题;) (2认同)