Sqlalchemy数据库int到python枚举
我现有的数据库中有很多整数,表示枚举。在我的python项目中,我创建了相应的枚举,如下所示:Sqlalchemy数据库int到python枚举,python,sqlalchemy,Python,Sqlalchemy,我现有的数据库中有很多整数,表示枚举。在我的python项目中,我创建了相应的枚举,如下所示: class Status(Enum): OK = 0 PENDING = 1 CANCELED = 2 DUPLICATE = 3 INCOMING = 4 BLOCKED = 5 在我的SQLalchemy模型中,我希望能够做到以下几点 status = Column(Status, nullable=False) 它应该将数据库整数转换为pyth
class Status(Enum):
OK = 0
PENDING = 1
CANCELED = 2
DUPLICATE = 3
INCOMING = 4
BLOCKED = 5
在我的SQLalchemy模型中,我希望能够做到以下几点
status = Column(Status, nullable=False)
它应该将数据库整数转换为python枚举并透明地返回
到目前为止,我已经尝试从sqlalchemy.types.TypeDecorator继承并覆盖process_bind_参数和process_result_值以前后转换int
然而,这意味着我必须违反DRY原则,对每个枚举重复此操作
因此,我更喜欢一个Mixin类,它继承sqlalchemy.types.TypeDecorator,并覆盖两个要向继承此Mixin的枚举强制转换的方法
关于如何实现这一点有什么想法吗?TypeDecorator可以简单地将枚举类型作为参数
class EnumAsInteger(sqlalchemy.types.TypeDecorator):
"""Column type for storing Python enums in a database INTEGER column.
This will behave erratically if a database value does not correspond to
a known enum value.
"""
impl = sqlalchemy.types.Integer # underlying database type
def __init__(self, enum_type):
super(EnumAsInteger, self).__init__()
self.enum_type = enum_type
def process_bind_param(self, value, dialect):
if isinstance(value, self.enum_type):
return value.value
raise ValueError('expected %s value, got %s'
% (self.enum_type.__name__, value.__class__.__name__))
def process_result_value(self, value, dialect):
return self.enum_type(value)
def copy(self, **kwargs):
return EnumAsInteger(self.enum_type)
class MyTable(Base):
status = sqlalchemy.Column(EnumAsInteger(Status), nullable=False)
你可能需要考虑的一件事是如何处理数据库中未知的枚举值。上述解决方案仅在看到此类值时抛出
ValueError
,例如在查询过程中。除了sqlalchemy的创建者之外,没有其他人能够很好地解决此问题:如果设置nullable=True
,会不会导致ValueError
异常?