sqlalchemy 加载方法如何工作?

Kha*_*yan 1 python sqlalchemy

我阅读了文档,但解释不够充分。所以我决定在这里寻求帮助。

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

Rém*_*net 5

  • 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'))
Run Code Online (Sandbox Code Playgroud)

如果将 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 ...
Run Code Online (Sandbox Code Playgroud)

如果 B 和 C 中都有 1000 个元素,则将返回 1 000 000 行,然后 sqlalchemy 将在 python 空间中排序重复项。对于大量数据和更多关系,它甚至可能使您的数据库或应用程序耗尽内存。

subqueryload不应该有这个问题,因为所有关系都是通过子查询单独加载的。我不完全确定subqueryload和之间的区别selectinload,但根据文档subqueryload是一个遗留加载程序,并被selectinload.

无论如何,在我们的项目中,我们使用以下策略(实际上是自动化的):

  • 加载单元素关系joinedload
  • 加载集合selectinload