SQLAlchemy ORM查询ENUM类型列时如何保留Enum枚举类型而非字符串
你当前配置中调用了.values_callable,该配置的作用就是让SQLAlchemy在和数据库交互时仅使用枚举的值(也就是字符串内容),因此查询返回的结果自然是字符串类型,而非枚举实例。
最优实现方案
直接移除.values_callable即可,SQLAlchemy原生支持Python标准库的Enum类型,会自动完成双向转换:
- 写入数据库时:自动提取枚举实例的
value属性存入ENUM列 - 查询读取时:自动把数据库中存储的字符串转换为对应的
BTypes枚举实例
修改后的ORM映射类代码如下:
from sqlalchemy import Enum class Example(Base): __tablename__ = "example" id = Column(Integer, primary_key=True) # 直接传入枚举类即可,无需额外参数 b = Column(Enum(BTypes))
效果验证
修改后执行查询,返回的b属性就是枚举类型:
data = session.query(Example).all() print(data[0].b) # 输出:BTypes.EXAMPLE_1 print(type(data[0].b)) # 输出:<enum 'BTypes'> print(data[0].b.value) # 输出:example_1
注意:该方案完全兼容存量数据,只要数据库ENUM列的取值和Python枚举类的
value一一对应,不需要修改任何现有存储内容即可直接生效。
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

