我阅读了文档,但说明不足。所以我决定在这里寻求帮助。
sqlalchemy加载方法之间的区别是:joinedload,lazyload,defaultload和subqueryload?尤其是joinedload和subqueryload之间的区别。 我很高兴看到对差异的尽可能简单的解释。谢谢
答案 0 :(得分:3)
假设一个A类拥有一个同时包含B和C的孩子的列表:
class A:
b_list = relationship(B, lazy='joined')
c_list = relationship(C, lazy='joined')
class B:
a_id = Column(ForeignKey('a.id'))
class C:
a_id = Column(ForeignKey('a.id'))
如果将b_list和c_list都设置为joinedload,则将发出以下sql(或类似的语句):
SELECT ... FROM A
LEFT JOIN B ON B.a_id = A.id
LEFT JOIN C ON C.a_id = A.id
WHERE ...
如果B和C中都有1000个元素,则将返回1 000 000行,则sqlalchemy将在python空间中整理出重复项。由于数量众多且关系更多,它甚至可能使数据库或应用程序用尽内存。
subqueryload应该不会出现此问题,因为所有关系都分别加载。我不能完全确定subqueryload和selectin之间的区别,但是根据文档(https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html#subquery-eager-loading),selectinload基本上是subqueryload的高级版本。
对于它的价值,在我们的项目中,我们使用以下策略(实际上是自动化的):