Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlalchemy数据库int到python枚举_Python_Sqlalchemy - Fatal编程技术网

Sqlalchemy数据库int到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

我现有的数据库中有很多整数,表示枚举。在我的python项目中,我创建了相应的枚举,如下所示:

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
异常?