SQLAlchemy一对多查询:获取全量父表且子表筛选site_id=100的方法
解决方案
场景1:返回全部父表Policy记录(无匹配子表时sites属性为空)
这种场景下需要将子表过滤条件放在join的on子句中,避免过滤掉没有符合条件子表的父表数据:
from sqlalchemy import and_ from sqlalchemy.orm import contains_eager # 注意:你现有代码中Site的外键定义存在问题,指向的表名和Policy实际表名不匹配 # 需将Site的policy_id外键修改为:ForeignKey("UmbrellaPolicy.id") policies = session.query(Policy)\ .outerjoin(Site, and_(Site.policy_id == Policy.id, Site.site_id == "100"))\ .options(contains_eager(Policy.sites))\ .all()
执行后遍历每个policy的sites属性,只会包含site_id为100的关联记录。
场景2:仅返回存在匹配子表的Policy记录
如果不需要保留无匹配子表的父表数据,可以直接用内连接加where过滤:
from sqlalchemy.orm import contains_eager policies = session.query(Policy)\ .join(Site)\ .filter(Site.site_id == "100")\ .options(contains_eager(Policy.sites))\ .all()
内容的提问来源于stack exchange,提问作者Fatima Fahad
相关产品推荐
相关产品推荐

