SQLAlchemy等效于具有嵌套关系的select_related和prefetch_related

时间:2017-07-18 15:39:36

标签: python django-models sqlalchemy

使用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中我查询了我不需要的模型C.

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

0 个答案:

没有答案