SQLAlchemy如何使用枚举列表对Enum类型字段执行过滤查询
问题根因
- 原生Python的
in运算符不会被SQLAlchemy重载,Message.status in [Status.failed, Status.success]只会在Python层判断Message.status列对象是否属于列表,结果永远为False,等价于过滤条件永远不成立,所以查询结果始终为空。 - 你用到的原生
or写法存在逻辑隐患:Python的or运算符优先级高于SQLAlchemy的表达式重载逻辑,实际执行时Message.status == Status.failed返回的SQL表达式对象布尔判定为真,or后面的条件会被直接忽略,相当于你只过滤了status = failed的记录,并非同时匹配两个枚举值,只是刚好符合部分测试场景。
正确实现方案
方法1:使用in_()方法(推荐,适合多值过滤)
SQLAlchemy为所有列对象提供了in_()方法,会自动生成标准SQL的IN语句,直接传入枚举值列表即可,框架会自动处理枚举到数据库存储值的映射:
session.query(Message).filter(Message.status.in_([Status.success, Status.failed])).all()
方法2:使用or_函数(适合少量条件逻辑或场景)
如果需要手动编写多条件或逻辑,必须使用SQLAlchemy提供的or_函数,不能用Python原生or:
from sqlalchemy import or_ session.query(Message).filter( or_( Message.status == Status.success, Message.status == Status.failed ) ).all()
内容的提问来源于stack exchange,提问作者Kallie
相关产品推荐
相关产品推荐

