为何在SQLAlchemy多对一关系中joinedload()优于selectinload()?
关于SQLAlchemy中selectinload()与joinedload()的疑问
我了解selectinload()和joinedload()的工作原理,也知晓二者的适用场景。根据SQLAlchemy官方文档:
一对多/多对多集合 - selectinload()通常是最佳加载策略。它会发出一条额外的SELECT语句,使用尽可能少的表,不影响原始查询语句,对任何初始查询都具有最高灵活性。其主要限制是在不支持“元组IN”的后端(目前包括SQL Server和非常旧的SQLite版本)上使用复合主键表时;其他所有支持的后端均支持该特性。
多对一 - joinedload()是最通用的策略。在特殊情况下,如果潜在关联值数量极少,immediateload()策略也可能有用,因为如果关联对象已存在于本地Session中,该策略无需发出SQL即可获取对象。
另外,官方文档还提到:
joinedload()策略最适合加载关联的多对一对象,因为它只需要在原本就要获取的主实体行中添加额外列。
从二者行为来看,joinedload在多对一关系中比一对多关系更适用,因前者不会导致主行重复,但关联表行仍会重复,结果集仅横向扩展。我认为即使在多对一关系中,selectinload()获取的数据量可能更少,是否误解了概念?还有哪些因素让joinedload()更适合多对一关系?
内容的提问来源于stack exchange,提问作者S.B
相关产品推荐
相关产品推荐

