带有PostgreSQL的SQLAlchemy中的ENUM类型

And*_*der 20 postgresql enums sqlalchemy

我正在使用带有postgresql数据库的SQLAlchemy核心,我想将ENUM类型添加到我的表定义中.根据postgresql文档,必须在创建表之前定义ENUM类型:

CREATE TYPE gender_enum AS ENUM ('female', 'male');

CREATE TABLE person (
  name VARCHAR(20),
  gender gender_enum
);
Run Code Online (Sandbox Code Playgroud)

问题是当我创建表定义时.阅读SQLAlchemy文档后,我找不到任何实现示例.我尝试过类似的东西,但它不起作用:

from sqlalchemy.dialects.postgresql import ENUM

person = Table('user_profile', metadata,
  Column('name', String(20)),
  Column('gender', ENUM('female','male'))
);
Run Code Online (Sandbox Code Playgroud)

怎么做?

m1y*_*ag1 25

@Tim的答案肯定是正确的,但我想提供我设置ENUM的方式.

在我的models.py中,我将创建值作为元组

skill_levels = ('Zero', 'A little', 'Some', 'A lot')

然后我将创建一个skill_level_enum变量并为其分配一个ENUM类,其技能级别值为args.

skill_level_enum = ENUM(*skill_levels, name="skill_level")

在我的表模型中,然后我传入skill_level_enum

class User(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    skill_level = db.Column(skill_level_enum)
Run Code Online (Sandbox Code Playgroud)

我发现这使我的代码更清晰,我能够更新我文件顶部的skill_levels,而不是扫描我的模型以获得正确的更新.


Tim*_*hiy 23

您需要从sqlalchemy导入Enum并为其添加名称.它应该像这样工作:

from sqlalchemy import Enum

person = Table("user_profile", metadata,
    Column("name", String(20)),
    Column("gender", Enum("female", "male", name="gender_enum", create_type=False))
);
Run Code Online (Sandbox Code Playgroud)

  • 为了这个与我合作postgres,我不得不`从sqlalchemy.dialects.postgresql导入ENUM` (9认同)
  • `create_type` 在这里实际上没有用 - 这是针对 `sqlalchemy.dialects.postgresql.ENUM` 的。简而言之 - 如果您想在“create_table”命令期间定义枚举类型*并创建它*,请使用“sqlalchemy.Enum”。如果您想在创建过程中为新表使用现有类型,请使用带有“create_type = False”的“dialects.postgresql.ENUM”类型 (4认同)
  • 为什么:`create_type = False`? (2认同)

Nic*_*ick 13

您可以使用Python 的本机枚举作为列类型的输入:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.dialects.postgresql import ENUM as pgEnum
from enum import Enum, unique

@unique
class errorTypeEnum(Enum):
    videoValidation = 'videoValidation'
    audioValidation = 'audioValidation'
    subtitleValidation = 'subtitleValidation'

db = SQLAlchemy()

class Error(db.Model):
    serviceID = db.Column(db.String(20), primary_key=True)
    timestamp = db.Column(db.DateTime, unique=False, nullable=False)
    category = db.Column(pgEnum(errorTypeEnum), unique=False, nullable=False)
Run Code Online (Sandbox Code Playgroud)