我为 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
、Bar
和 Foo
已正确定义,因为 sqlalchemy 正确地将行保留到表中。
最佳答案
我不是 SQLAlchemy 用户,但我可以说 Enum
的要点是提供唯一值的文本表示。
根据您的描述,我认为 IntEnum
最好为您服务,同时仍然具有 Bar.foo
或 Bar.baz< 的文本表示形式
仍然可以直接用作 int
1
或 3
关于python - SQLAlchemy 从 TypeDecorator 获取原始 SQL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491490/