我在 SQLAlchemy 中有一个模型,其中一列是一个枚举。为了尽可能接近 vanilla SQLAlchemy 和 Python3 stdlib,我针对 stdlib 的 enum.Enum
类定义了枚举,然后使用它的 sqlalchemy.Enum 将其提供给 SQLAlchemy
类(如 SQLAlchemy 文档中某处所推荐的那样。)
class TaxonRank(enum.Enum):
domain = "domain"
kingdom = "kingdom"
phylum = "phylum"
class_ = "class"
order = "order"
family = "family"
genus = "genus"
species = "species"
在模型中:
rank = sqlalchemy.Column(sqlalchemy.Enum(TaxonRank), name = "rank", nullable = False)
这很好用,除了强制我使用 class_
而不是 class
作为枚举值之一(自然是为了避免与 Python 关键字冲突;这是非法语法尝试访问 TaxonRank.class
。)
我真的不介意使用 class_
,但我遇到的问题是 class_
是最终存储在数据库中的值。这反过来又导致我的 CRUD API 出现问题,其中我允许用户执行诸如“过滤排名以 ss
结尾的排名”之类的事情。这自然不会匹配任何内容,因为该值实际上以 ss_
结尾!
对于记录显示,我一直在进行一些不恰当的逐案翻译,以始终显示用户 class
而不是 class_
。但是,执行与排序和过滤类似的操作更加棘手,因为我在 SQL 级别执行了这两项操作。
所以我的问题是:是否有解决这种轻微烦恼的好方法?我真的不关心在我的 Python 中访问 TaxonRank.class_
,但也许有一种方法可以将 stdlib 的 enum.Enum
子类化以强制 的字符串表示>class_
属性(以及实际存储在数据库中的值)到所需的 class
?
最佳答案
感谢Sergey Shubin向我指出定义 enum.Enum 的替代形式。
TaxonRank = enum.Enum("TaxonRank", [
("domain", "domain"),
("kingdom", "kingdom"),
("phylum", "phylum"),
("class", "class"),
("order", "order"),
("family", "family"),
("genus", "genus"),
("species", "species")
])
关于python - 如何在 Python/SQLAlchemy 中使用 "class"作为枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343467/