SqlalChemy数据库int到python枚举

编程入门 行业动态 更新时间:2024-10-24 14:15:21
本文介绍了SqlalChemy数据库int到python枚举的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

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

class Status(Enum): OK = 0 PENDING = 1 CANCELED = 2 DUPLICATE = 3 INCOMING = 4 BLOCKED = 5

在我的SQLalChemy模型中,我希望能够执行以下操作

status = Column(Status, nullable=False)

它应透明地将数据库整数转换为Python枚举

到目前为止,我已经尝试从sqlalChemy.tyes.TypeDecorator继承,并重写PROCESS_BIND_PARAM和PROCESS_RESULT_VALUE以来回转换int。

但是,这将意味着我必须为每个枚举重复此操作,这违反了DRY原则。

因此,我更喜欢一个继承了sqlalChemy.tyes.TypeDecorator的Mixin类,并覆盖了两个方法,以强制转换到继承此混合的Enum,以及从Enum转换。

有什么办法解决这个问题吗?

推荐答案

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数据库int到python枚举

本文发布于:2023-10-16 00:33:37,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1495948.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据库   SqlalChemy   python   int

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!