【问题标题】:sqlalchemy joinedload: syntax to load multiple relationships more than 1 degree separated from query table?sqlalchemyjoinedload:从查询表中加载超过 1 度的多个关系的语法?
【发布时间】:2018-08-22 18:28:48
【问题描述】:

是否有更简洁的语法用于使用 sqlalchemy joinedload 从多个表中急切加载项目,这些表仅通过另一个中间表与查询表相关(或者是否有替代加载语法更适合我正在尝试做)?

比如使用大家熟悉的问题、答案等数据结构,有没有比下面的例子更简洁的方式来查询一个问题,急切加载相关答案,同时急切加载答案cmets和答案投票(假设,对于这个例子,这两个与答案相关的项目都包含在单独的表中)?

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()

我找不到任何通过Relationship Loading Techniques(或其他任何地方)的中间表加载多个表的示例。我确实尝试在单个 joinedload 中包含多个子关系,例如...

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

...但是,毫不奇怪,这种方法只是链接连接。

【问题讨论】:

    标签: python join sqlalchemy


    【解决方案1】:

    你想要Load.options()

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

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

    【讨论】:

    • 对于那些希望实现这种方法的人,请注意 Load.options() 是 SQLAlchemy 版本 1.3.6 中新添加的。
    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多