SQLAlchemy 相当于具有嵌套关系的 select_lated 和 prefetch_lated

fra*_*tiz 5 python sqlalchemy django-models

使用 Django ORM 的此查询需要 0.03 秒:

entry = ModelA.objects.select_related(
            'modelB',
            'modelC',
        ).prefetch_related(
            'modelB__modelD',
            'modelE',
            'modelE__modelF',
            'modelE__modelF__modelG',
            'modelE__modelF__modelG__modelH1',
            'modelE__modelF__modelG__modelH2',
            'modelE__modelF__modelG__modelH3',
            'modelE__modelF__modelI',
            'modelE__modelF__modelJ',
        ).get(id=1)
Run Code Online (Sandbox Code Playgroud)

我在 SQLAlchemy 中想出的等效方法需要 0.12 秒*:

entry = session.query(ModelA) \
        .options(joinedload(ModelA.modelB).joinedload(ModelB.modelD)) \
        .options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
                .subqueryload(ModelF.modelG).subqueryload('*')) \
        .options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
                .subqueryload(ModelF.modelI)) \
        .options(subqueryload(ModelA.modelE).subqueryload(ModelE.modelF)
                .subqueryload(ModelF.modelJ)) \
        .filter(ModelA.id = 1) \
        .first()
Run Code Online (Sandbox Code Playgroud)

*我意识到在 Django 中我查询了我并不真正需要的 modelC。

  • 如何通过字段,和替换subqueryload('*')同一个表所需的多个关系?modelH1modelH2modelH3
  • 当我对ModelE实例进行迭代时,对 to 的引用会ModelA在 sqlAlchemy 中触发一个新查询,而在 Django ORM 中它会自动填充。我有什么遗漏的吗?