Flask+PostgreSQL使用SQLAlchemy存枚举值时报InvalidTextRepresentation错误如何解决?
错误产生原因
- 传入的枚举值被额外包裹了双引号:报错提示实际传给PostgreSQL的枚举值为
""YES"",而非纯字符串YES。问题根源是marshmallow的SQLAlchemyAutoSchema未对PostgreSQL专属ENUM类型做适配,反序列化时对字符串值做了多余的转义/包裹处理,导致数据库无法识别合法枚举值。 - 枚举类型名不匹配:你代码中定义ENUM时指定的名称为
_option,但报错提示数据库中实际的枚举类型名为status_option,且你设置了create_type=False要求SQLAlchemy复用已有枚举类型,名称不匹配也会触发校验错误。
修复方案
- 修正模型枚举名匹配
首先将模型中ENUM的name参数改为和数据库一致的status_option:
from sqlalchemy.dialects import postgresql class MyModel(db.Model): __tablename__ = 'mytables' id = db.Column(db.Integer, primary_key=True) datetime = db.Column(db.DateTime, nullable=False) # 修正name参数为数据库实际枚举名 option = db.Column(postgresql.ENUM('YES', 'NO', 'MAYBE', name='status_option', create_type=False), nullable=False) data = db.Column(db.String(20))
- 显式指定Schema的枚举字段规则
在序列化Schema中手动指定option字段为纯字符串类型,避免自动适配产生的多余转义,还可以加枚举值校验:
from ma import ma from marshmallow import fields, validate from models.mymodel import MyModel class MySchema(ma.SQLAlchemyAutoSchema): # 显式指定字段类型,加合法值校验 option = fields.Str(validate=validate.OneOf(['YES', 'NO', 'MAYBE'])) class Meta: model = MyModel load_instance = True include_fk = True
- 可选兼容方案:改用通用枚举类型
如果不需要强绑定PostgreSQL专属ENUM特性,可以替换为SQLAlchemy通用的Enum类型,框架会自动处理值转换,适配性更强:
from sqlalchemy import Enum class MyModel(db.Model): __tablename__ = 'mytables' # 省略其他字段 option = db.Column(Enum('YES', 'NO', 'MAYBE', name='status_option'), nullable=False)
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

