SQLAlchemy从TypeDecorator获取原始SQL值

时间:2016-02-18 20:11:58

标签: python sql enums sqlalchemy

我为sqlalchemy定义了以下自定义类型:

class EnumColumnType(TypeDecorator):
    impl = Integer

    def __init__(self, enum, *args, **kwargs):
        self.enum = enum
        super(EnumColumnType, self).__init__(*args, **kwargs)

    def process_bind_param(self, value, dialect):
        if value is None:
            return None
        return value.value

    def process_result_value(self, value, dialect):
        if value is None:
            return None
        return self.enum(value)

    @property
    def python_type(self):
        return int

本质上,它封装了一个python枚举,并将其作为整数写回sql表。

假设我定义了以下枚举:

class Bar(Enum):
    foo = 1
    bar = 2
    baz = 3

假设我有一个模型如下:

class Foo(base):
    enum = Column(EnumColumnType(Bar))
    id = Column(Integer, primary_key=True)

如果我有一个Foo实例,即row = Foo(enum=Bar.baz),我是否可以获得row.enum的sql类型?目前,row.enum正确评估为Bar.baz,但我想得到3,该值被写入sql表。是否有可能做到这一点?请注意,EnumColumnTypeBarFoo已正确定义,因为sqlalchemy正确地将行保留在表中。

1 个答案:

答案 0 :(得分:1)

我不是SQLAlchemy用户,但我可以说Enum的要点是提供唯一值的文本表示。

根据您的描述,我认为IntEnum会最好地为您提供服务,但Bar.fooBar.baz的文字表示仍然可以直接用作{{1} }} int1