SQLAlchemy 和 PostgreSQL 中的 ENUM 类型的值是变量而不是值?

问题描述 投票:0回答:1

所以我的问题是我试图用 int 值创建一个枚举,但它不起作用。

首先,这是代码。

class UserRole(enum.IntEnum):
    publisher = 4
    editor = 3
    manager = 2
    admin = 1 


class User(Base):
    __tablename__ = "user"

    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, nullable=False, index=True)
    username = Column(String, unique=True, nullable=False, index=True)
    hashed_password = Column(String, nullable=False)
    user_role = Column(Enum(UserRole), default=UserRole.reader)

现在当我创建用户时,去查看 user_role 我发现它是 admin 而不是 1 我认为它可能是一个缓存,所以我删除了所有缓存并重新创建了数据库。

直到我尝试更改其中一个变量并发现存储在数据库中的枚举值是变量本身而不是值。

请帮助我如何将枚举数据作为 int 存储在数据库中。

我最后一次尝试是

class UserRole(enum.IntEnum):
    reader: int = 7
    Pro_reader: int = 6
    publisher: int = 5
    editor: int = 4
    small_manager: int = 3
    big_manager: int = 2
    admin: int = 1

但没有成功。

python postgresql sqlalchemy enums fastapi
1个回答
0
投票

要使用 Enum 的值,您需要设置 values_callable 参数:

user_role = Column(
    Enum(UserRole, values_callable=lambda choices: [item.value for item in choices]),
    default=UserRole.reader
)

在 SQLAlchemy 文档中查找本部分的底部。你会发现:

为了保留值而不是名称,可以使用 Enum.values_callable 参数....对于使用字符串值的简单枚举,可调用诸如 lambda x: [e.value for e in x] 是足够了。

© www.soinside.com 2019 - 2024. All rights reserved.