带有PostgreSQL的SQLAlchemy中的ENUM类型

时间:2015-03-06 07:48:05

标签: postgresql enums sqlalchemy

我正在使用SQLAlchemy core和postgresql数据库,我想将 ENUM 类型添加到我的表定义中。根据{{​​3}},必须在创建表之前定义ENUM类型:

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

CREATE TABLE person (
  name VARCHAR(20),
  gender gender_enum
);

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

from sqlalchemy.dialects.postgresql import ENUM

person = Table('user_profile', metadata,
  Column('name', String(20)),
  Column('gender', ENUM('female','male'))
);

必须如何做?

4 个答案:

答案 0 :(得分:21)

@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)

我发现这使我的代码更清晰,我可以更新我文件顶部的skill_levels,而不是扫描我的模型以便更新。

答案 1 :(得分:18)

您需要从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))
);

答案 2 :(得分:1)

您也可以将Python's native enums用作列类型:

from flask_sqlalchemy import SQLAlchemy
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)

答案 3 :(得分:0)

下面的代码在SQLAlchemy 1.3.11和Postgres 12.0上对我有用。

在创建用户表之前,必须首先在postgres中创建Enum类型。可以直接通过sql语句完成。

CREATE TYPE permission AS ENUM ('READ_ONLY', 'READ_WRITE', 'ADMIN', 'OWNER');

然后设置项目模型

from flask_sqlalchemy import SQLAlchemy    

db = SQLAlchemy()

class User(db.Model): 
    __tablename__ = 'user'

    user_id = db.Column(db.Integer, primary_key=True)   
    username = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(200), nullable=False)
    access = db.Column(db.Enum('READ_ONLY', 'READ_WRITE', 'ADMIN', 'OWNER', name="permission"))