SqlalChemy数据库int到python枚举 [英] Sqlalchemy database int to python enum
本文介绍了SqlalChemy数据库int到python枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我现有的数据库中有很多表示枚举的整数。在我的python项目中,我创建了相应的枚举,如下所示:
class Status(Enum):
OK = 0
PENDING = 1
CANCELED = 2
DUPLICATE = 3
INCOMING = 4
BLOCKED = 5
在我的SQLalChemy模型中,我希望能够执行以下操作
status = Column(Status, nullable=False)
它应透明地将数据库整数转换为Python枚举
到目前为止,我已经尝试从sqlalChemy.tyes.TypeDecorator继承,并重写PROCESS_BIND_PARAM和PROCESS_RESULT_VALUE以来回转换int。
但是,这将意味着我必须为每个枚举重复此操作,这违反了DRY原则。
因此,我更喜欢一个继承了sqlalChemy.tyes.TypeDecorator的Mixin类,并覆盖了两个方法,以强制转换到继承此混合的Enum,以及从Enum转换。
有什么办法解决这个问题吗?
推荐答案
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数据库int到python枚举的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文