sqlalchemy加载方法是如何工作的?

2024-05-16 19:02:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我看了文件,但解释不够。所以我决定在这里寻求帮助。你知道吗

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


Tags: 文件方法sqlalchemy差异区别lazyload载荷subqueryload
1条回答
网友
1楼 · 发布于 2024-05-16 19:02:59
  • 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\u list和c\u list都设置为joinedload,则将发出以下sql(或类似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个元素,那么将返回1000000行,然后sqlalchemy将在python空间中整理出重复的元素。对于大量的数据和更多的关系,它甚至可能会导致数据库或应用程序内存不足。你知道吗

子queryload不应该有这个问题,因为所有关系都是单独加载的。我不完全确定subqueryload和selectin之间的区别,但是根据文档(https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html#subquery-eager-loading),selectinload基本上是subqueryload的高级版本。你知道吗

值得一提的是,在我们的项目中,我们使用以下策略(实际上是自动的):

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

相关问题 更多 >