SQLAlchemy多对多关联场景下join前应用filter按标签筛选规则
SQLAlchemy多对多关联排除指定标签规则实现方案
错误原因说明
你当前的实现逻辑是过滤规则与标签的关联行,仅剔除关联关系中匹配排除标签的条目,只要规则存在其他未被排除的标签,规则本身仍会保留,不符合「只要规则关联任意一个待排除标签就完全过滤该规则」的需求。
实现方案
方案1:子查询取排除规则ID过滤(写法简单易读)
from sqlalchemy import select # 先查询所有关联了待排除标签的规则ID exclude_rule_ids = select(Rule.id).join(Rule.tags).filter(Tag.name.in_(tags)).scalar_subquery() # 主查询直接排除上述ID对应的规则 rules = rules.filter(Rule.id.not_in(exclude_rule_ids))
方案2:NOT EXISTS实现(大数据量下性能更优)
直接基于中间表做存在性判断,避免子查询返回大量ID:
from sqlalchemy import exists exclude_stmt = ~exists().where( Rule.id == tags_rules.c.rule_id, tags_rules.c.tag_id == Tag.id, Tag.name.in_(tags) ) rules = rules.filter(exclude_stmt)
两种方案均可实现需求:只要规则关联了任意一个待排除标签,就会被完全过滤出结果集。
内容的提问来源于stack exchange,提问作者Gigg
相关产品推荐
相关产品推荐

