Python SQLAlchemy相当于与嵌套关系相关的select_和prefetch_

Python SQLAlchemy相当于与嵌套关系相关的select_和prefetch_,python,django-models,sqlalchemy,Python,Django Models,Sqlalchemy,使用Django ORM进行此查询需要0.03秒: entry = ModelA.objects.select_related( 'modelB', 'modelC', ).prefetch_related( 'modelB__modelD', 'modelE', 'modelE__modelF', 'modelE__modelF__mo

使用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)
我在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()
*我意识到,在Django中,我查询的modelC并不是我真正需要的

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

请发布您的模型定义。从我对Django的(非常有限的)理解来看,这两种定义看起来并不相同。例如,在Django版本中,您使用预回迁加载通过ModelB获取ModelD的相关信息,但在SQLA版本中,您使用joinedload,或者换句话说,您可能使用ModelA left join ModelB left join ModelD,这取决于您的数据和数据库,效率可能要低得多。您是否了解到这一点?这里的评论不是很有帮助,我也很好奇答案是什么!