sqlalchemy joinload:语法来加载多个与查询表分开1度以上的关系?

ben*_*nvc 5 python join sqlalchemy

是否有使用sqlalchemy的更简洁的语法joinedload来渴望从一个以上的表加载项目,而该表仅通过另一个中间表与查询表相关(或者是否有一种更适合我尝试执行的加载语法) ?

例如,使用常见的问题,答案等数据结构,比下面的示例有更简洁的方法来查询问题,渴望加载相关答案以及渴望加载答案注释和答案票(假设,对于此示例,这两个与答案相关的项目都包含在单独的表格中)?

from sqlalchemy.orm import joinedload

result = session.query(Question).\
    options(
       joinedload(Question.answers).
       joinedload(Answer.comments)
       ).\
    options(
       joinedload(Question.answers).
       joinedload(Answer.votes)
       ).\
    filter(Question.id == '1').\
    first()
Run Code Online (Sandbox Code Playgroud)

在“ 关系加载技术”(或与此相关的其他任何地方)中,我找不到通过中间表加载多个表的任何示例。我确实尝试在一个单一的对象中包含多个子关系joinedload...

result = session.query(Question).\
    options(joinedload(Question.answers, Answer.comments, Answer.votes)).\
    filter(Question.id == '1').\
    first()
Run Code Online (Sandbox Code Playgroud)

...但是这种方法并不奇怪,只是将联接链化了。

Chr*_*cca 17

你要Load.options()

那么你的代码将是这样的:

result = session.query(Question).\
    options(
        joinedload(Question.answers).\
        options(
            joinedload(Answer.comments),
            joinedload(Answer.votes)
            )
        ).\
    filter(Question.id == '1').\
    first()
Run Code Online (Sandbox Code Playgroud)

  • 对于那些希望实现此方法的人,请注意 SQLAlchemy 版本 1.3.6 中新添加了“Load.options()”。 (2认同)