在Pony ORM查询中使用IntEnum枚举值出现类型不支持错误如何解决
问题原因
PonyORM的查询解析器未内置对IntEnum枚举实例的类型支持,哪怕IntEnum在Python语法层面是int的子类,ORM在做表达式解析时也会将Supplier.MyFirstSupplier识别为自定义的Supplier枚举类型,而非原生int,因此触发类型不支持的报错。
解决方案
- 方案1:直接取枚举成员的value值(无侵入,最推荐)
每次查询时主动获取枚举实例的value属性,该属性就是你定义的主键整数值,修改查询语句如下:select(sup for sup in SupplierModel if sup.id == Supplier.MyFirstSupplier.value) - 方案2:给ORM注册枚举类型转换器(适合枚举使用频率高的场景)
提前给PonyORM注册Supplier枚举的类型转换规则,让ORM碰到该类型时自动取value转成int,注册代码仅需在项目初始化时执行一次:
注册完成后原有查询语句无需修改即可正常运行。from pony.orm import sqltypes sqltypes.register_converter( py_type=Supplier, converter=lambda enum_val: enum_val.value, db_type=int ) - 方案3:全局适配所有IntEnum类型
如果项目中大量用到IntEnum做数据库查询匹配,可以写通用转换器适配所有IntEnum子类,无需逐个枚举注册:from enum import IntEnum from pony.orm import sqltypes def int_enum_converter(val): if isinstance(val, IntEnum): return val.value return val sqltypes.register_converter(IntEnum, int_enum_converter, int)
内容的提问来源于stack exchange,提问作者M.L
相关产品推荐
相关产品推荐

