sqlalchemy加载方法如何工作?

时间:2019-06-04 08:40:01

标签: python sqlalchemy

我阅读了文档,但说明不足。所以我决定在这里寻求帮助。

sqlalchemy加载方法之间的区别是:joinedload,lazyload,defaultload和subqueryload?尤其是joinedload和subqueryload之间的区别。 我很高兴看到对差异的尽可能简单的解释。谢谢

1 个答案:

答案 0 :(得分:3)

  • lazyload不会立即加载,但会等待首次访问
  • subqueryload和joinedload都立即加载相关的集合,但是会发出不同的SQL。即使两种模式的结果相同,也可能会有很大的性能差异。

假设一个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的高级版本。

对于它的价值,在我们的项目中,我们使用以下策略(实际上是自动化的):

  • 使用joinedload加载单个元素关系。
  • 使用selectinload加载集合。