SQLAlchemy ORM如何关联查询子Event对应的关联Node节点
解决方案
你需要额外关联子Event别名对应的Node表,并指定嵌套的预加载规则即可实现需求,修正后的查询代码如下:
from sqlalchemy.orm import aliased, contains_eager event_alias = aliased(Event) query = Event.query.outerjoin(Event.node) \ .options(contains_eager(Event.node)) \ .outerjoin(Event.children.of_type(event_alias)) \ # 新增:关联子Event对应的Node表 .outerjoin(event_alias.node) \ .options( contains_eager(Event.node), # 新增:指定子Event的node属性也用预加载映射 contains_eager(Event.children.of_type(event_alias)).contains_eager(event_alias.node) )
改动说明
- 新增
event_alias.node的关联join:你原来的查询只关联了父级Event的Node表,子Event对应的Node数据根本没有被加入查询结果集,ORM自然无法完成属性映射。 - 嵌套声明
contains_eager:通过链式调用contains_eager,明确告诉ORM要把查询返回的Node字段,映射到Event.children集合里每个子元素的node属性上。
该方案不会产生额外的N+1查询,所有关联数据都在单次SQL查询中返回,完全适配你模型里定义的noload懒加载策略。
内容的提问来源于stack exchange,提问作者Biopsy Alternator
相关产品推荐
相关产品推荐

