我阅读了文档,但解释不够充分。所以我决定在这里寻求帮助。
sqlalchemy 加载方法有什么区别:joinedload、lazyload、defaultload 和 subqueryload?尤其是 joinload 和 subqueryload 之间的区别。我很高兴看到对差异尽可能简单的解释。谢谢
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。| 归档时间: |
|
| 查看次数: |
1874 次 |
| 最近记录: |