python - 如何在 Python/SQLAlchemy 中使用 "class"作为枚举值?

标签 python enums sqlalchemy

我在 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/

相关文章:

python - sqlalchemy-三个实体通过一个表连接

python - 如何使用 Tornado 实现时间线(实时 - 就像 Twitter 的)?

java - 如何在 Java 中将十六进制字符串转换为 ANSI (windows 1252) 并将 ANSI (windows 1252) 转换回十六进制字符串?

托管在应用引擎上的 Python 应用无法与 Firestore 连接,而在本地运行时

c# - 在 C# 中将字符串转换为枚举标记

java - 枚举是否可以为其每个常量都有一个构造函数

Python。通过url读取文件时的文件编码

c# - 如何在值元组中使用泛型类型?

python - 在flask-sqlalchemy中使用with_entities()返回自定义属性?

python - 如何从flask-SQLAlchemy 查询SQL View