python - SQLAlchemy 从 TypeDecorator 获取原始 SQL 值

标签 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 正确地将行保留到表中。

最佳答案

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

根据您的描述,我认为 IntEnum 最好为您服务,同时仍然具有 Bar.fooBar.baz< 的文本表示形式 仍然可以直接用作 int 13

关于python - SQLAlchemy 从 TypeDecorator 获取原始 SQL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491490/

相关文章:

python - 网络抓取 python 中的 craigslist 公寓价格未显示最高成本公寓

Python 转换样式 : inside or out of function?

sql - 按规则创建自定义 SQL 顺序

Java:如何将 String ArrayList 分配给 List<Enum>

python - 如何将 UNIX 查找输出作为 Python 脚本的参数传递?

python - 从 .csv 文件创建一个 numpy 数组,但我只能得到数组中的第一行——我错过了什么?

sql - 将 2 个复杂的 GROUP BY/PARTITION BY 查询调整为 1 个查询

sql - SQL 服务器查询中的 NULL 值

string - 我可以在 Rust 中将字符串转换为没有宏的枚举吗?

c# - 如何在 C# 中为枚举重载运算符?