You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:03