【问题标题】:SqlAlchemy ORM eager load an object's relationshipsSqlAlchemy ORM 急切加载对象的关系
【发布时间】:2014-10-13 22:47:45
【问题描述】:

我有一个 ORM 关系的树结构,它(比方说)4 级深。默认情况下,它们不会预先加载。我处于需要获取树的“副本”的情况。所以我有类似的东西:

root = my_obj
for rel1 in root.some_relationship:
    for rel2 in rel1.some_other_relationship:
        ... etc ...

所以,很明显,这是经典的“必须去数据库加载每个关系”的问题,而且需要很长时间。我知道我可以执行实际查询以使用 subqueryload (http://docs.sqlalchemy.org/en/rel_0_9/orm/loading.html#sqlalchemy.orm.subqueryload) 加载 root.some_relationship 中的对象,但如果我已经拥有 root.some_relationship 的句柄,我可以告诉该对象急切加载子关系列表吗?

root.some_relationship.eagerload('some_other_relationship.yet_another_rel')

将是我正在尝试做的伪代码。

如果没有,则查询已加载对象及其关系的查询,如下所示:

obj = session.query(root.some_rel_fk_id).subqueryload(....)

是最好的方式,那就太酷了。

非常感谢您的帮助!

【问题讨论】:

    标签: python orm sqlalchemy flask-sqlalchemy


    【解决方案1】:

    在查询时加载是最好的(也许只是,但永远不要说永远)方法。但是,您的查询示例是错误的。您在 options 调用中指定加载:

    root = session.query(MyModel
    ).options(subqueryload('my_rel').subqueryload('sub_rel'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 2014-02-24
      • 2017-09-15
      • 2018-05-15
      • 1970-01-01
      • 2021-04-28
      • 2015-03-12
      相关资源
      最近更新 更多