繁体   English   中英

SQLAlchemy从TypeDecorator获取原始SQL值

[英]SQLAlchemy Get Raw SQL Value from TypeDecorator

我为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表。 是否有可能做到这一点? 注意,由于EnumColumnType正确地将行保留到表中,因此EnumColumnTypeBarFoo的定义正确。

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

从您的描述中,我认为最好使用一个IntEnum ,它虽然仍具有Bar.fooBar.baz的文本表示形式, Bar.foo仍可以直接用作int 13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM