SQLAlchemy多对一uselist=False关系查询filter关联表结果不匹配问题
问题原因分析与解决方案
核心原因
你写的查询逻辑和Data.article关系的加载逻辑是完全独立的,两者没有关联:
- 主查询的
join+filter仅负责筛选符合条件的Data实例:逻辑是「找到所有存在2021-05-06的关联Article的Data记录」,仅用来过滤返回哪些Data,不会影响article属性的加载规则。 Data.article关系在定义时指定了order_by="Article.date.desc()",默认懒加载触发时,会单独发送SQL查询该Data对应的所有Article,按日期倒序取第一条,完全不会继承主查询的筛选条件,所以永远返回最新的2021-05-07的记录。
解决方案
要让筛选后的Article直接绑定到article属性,需要用contains_eager指定将join得到的Article数据直接作为关联属性加载,避免触发默认的懒加载逻辑:
from sqlalchemy.orm import contains_eager from datetime import date result = db.query(models.Data)\ .join(models.Article, models.Article.date == date(2021, 5, 6))\ .options(contains_eager(models.Data.article))\ .all()
执行后返回的Data实例的article属性就会是你筛选出的2021-05-06对应的id=2886的记录,符合预期。
优化建议
如果你的业务场景经常需要按不同日期筛选关联Article,不建议把uselist=False写死在关系定义里,可以改为一对多关系article_list = relationship("Article", order_by="Article.date.desc()"),需要取特定日期的文章时直接从列表里过滤,灵活性更高。
内容的提问来源于stack exchange,提问作者Martin Fischer
相关产品推荐
相关产品推荐

