带有 PostgreSQL 的 SQLAlchemy 中的 ENUM 类型
ENUM type in SQLAlchemy with PostgreSQL
我正在使用 SQLAlchemy core with a postgresql database and I would like to add the ENUM type to my table definition. According to the postgresql documentation,必须在创建 table 之前定义 ENUM 类型:
CREATE TYPE gender_enum AS ENUM ('female', 'male');
CREATE TABLE person (
name VARCHAR(20),
gender gender_enum
);
问题出在我创建 table 定义时。阅读 SQLAlchemy documentation 后,我找不到任何实施示例。我试过类似的方法,但没有用:
from sqlalchemy.dialects.postgresql import ENUM
person = Table('user_profile', metadata,
Column('name', String(20)),
Column('gender', ENUM('female', 'male'))
);
必须怎么做?
您需要从 sqlalchemy 导入枚举并为其添加名称。它应该像这样工作:
from sqlalchemy import Enum
person = Table("user_profile", metadata,
Column("name", String(20)),
Column("gender", Enum("female", "male", name="gender_enum", create_type=False))
);
@Tim 的回答绝对正确,但我想提供我设置 ENUM 的方式。
在我的 models.py 中,我会将值创建为元组
skill_levels = ('Zero', 'A little', 'Some', 'A lot')
然后我将创建一个 skill_level_enum 变量并为其分配一个 ENUM class 并将技能水平值作为参数。
skill_level_enum = ENUM(*skill_levels, name="skill_level")
在我的 table 模型中,然后我传入 skill_level_enum
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
skill_level = db.Column(skill_level_enum)
我发现这让我的代码更简洁,而且我能够更新文件顶部的 skill_levels,而不是扫描我的模型以查找正确的更新内容。
下面的代码适用于 SQLAlchemy 1.3.11 和 Postgres 12.0。
您必须先在 postgres 中创建 Enum 类型,然后才能创建用户 table。这可以通过 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"))
您也可以使用 Python's native enums 作为列类型:
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)
我正在使用 SQLAlchemy core with a postgresql database and I would like to add the ENUM type to my table definition. According to the postgresql documentation,必须在创建 table 之前定义 ENUM 类型:
CREATE TYPE gender_enum AS ENUM ('female', 'male');
CREATE TABLE person (
name VARCHAR(20),
gender gender_enum
);
问题出在我创建 table 定义时。阅读 SQLAlchemy documentation 后,我找不到任何实施示例。我试过类似的方法,但没有用:
from sqlalchemy.dialects.postgresql import ENUM
person = Table('user_profile', metadata,
Column('name', String(20)),
Column('gender', ENUM('female', 'male'))
);
必须怎么做?
您需要从 sqlalchemy 导入枚举并为其添加名称。它应该像这样工作:
from sqlalchemy import Enum
person = Table("user_profile", metadata,
Column("name", String(20)),
Column("gender", Enum("female", "male", name="gender_enum", create_type=False))
);
@Tim 的回答绝对正确,但我想提供我设置 ENUM 的方式。
在我的 models.py 中,我会将值创建为元组
skill_levels = ('Zero', 'A little', 'Some', 'A lot')
然后我将创建一个 skill_level_enum 变量并为其分配一个 ENUM class 并将技能水平值作为参数。
skill_level_enum = ENUM(*skill_levels, name="skill_level")
在我的 table 模型中,然后我传入 skill_level_enum
class User(db.Model):
id = db.Column(db.Integer(), primary_key=True)
skill_level = db.Column(skill_level_enum)
我发现这让我的代码更简洁,而且我能够更新文件顶部的 skill_levels,而不是扫描我的模型以查找正确的更新内容。
下面的代码适用于 SQLAlchemy 1.3.11 和 Postgres 12.0。
您必须先在 postgres 中创建 Enum 类型,然后才能创建用户 table。这可以通过 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"))
您也可以使用 Python's native enums 作为列类型:
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)