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
相关产品推荐
相关产品推荐

