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

SQLAlchemy中db.Enum类型检测与枚举值获取报错排查

报错根因

逻辑存在两处错误:

  • 传入col函数的_type是db.Enum(JTEnum)实例化后的SQLAlchemy枚举类型对象,本身不属于可迭代对象,直接执行for i in _type必然触发不可迭代报错。
  • 自定义的Python枚举类,是绑定在db.Enum实例的enum_class属性上的,直接迭代_type无法获取到你定义的枚举成员。
修正后实现

直接调整类型判断后的取值逻辑即可,修改后的函数代码如下:

def col(_type, label = "", **kwargs):
    c = db.Column(_type, **kwargs)
    c.info = {"label":label, "type":""}
    if isinstance(_type, db.Enum):
       # 取出绑定的自定义枚举类再迭代生成choices
       enum_cls = _type.enum_class
       c.info["choices"] = [(i.name, i.value) for i in enum_cls]
    return c

修改完成后,原有枚举列的定义代码不需要再手动编写jobtype.info["choices"]赋值逻辑,调用col函数时会自动完成choices填充,效果和手动赋值完全一致。

如果使用的是较早版本的SQLAlchemy,不存在enum_class属性,可以换用内置的enums属性直接获取枚举成员列表,兼容写法如下:

def col(_type, label = "", **kwargs):
    c = db.Column(_type, **kwargs)
    c.info = {"label":label, "type":""}
    if isinstance(_type, db.Enum):
       c.info["choices"] = [(i.name, i.value) for i in _type.enums]
    return c

内容的提问来源于stack exchange,提问作者Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:27:27