使用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('*')
,modelH1
和modelH2
将modelH3
与所需的多个关系替换为同一个表?ModelE
个实例进行迭代时,对ModelA
的引用会在sqlAlchemy中触发一个新查询,而在Django ORM中,它会自动填充。有什么我想念的吗?