如何在SQLAlchemy和Alembic中使用Enum?

21 浏览
0 Comments

如何在SQLAlchemy和Alembic中使用Enum?

这是我的帖子模型:

class Post(Base):
    __tablename__ = 'posts'
    title = db.Column(db.String(120), nullable=False)
    description = db.Column(db.String(2048), nullable=False)

我想在这个模型中添加Enum status。所以我创建了一个新的Enum:

import enum
class PostStatus(enum.Enum):
    DRAFT='draft'
    APPROVE='approve'
    PUBLISHED='published'

并在模型中添加了一个新的字段:

class Post(Base):
    ...
    status = db.Column(db.Enum(PostStatus), nullable=False, default=PostStatus.DRAFT.value, server_default=PostStatus.DRAFT.value)

执行FLASK_APP=server.py flask db migrate后,生成了这样的迁移:

def upgrade():
    op.add_column('posts', sa.Column('status', sa.Enum('DRAFT', 'APPROVE', 'PUBLISHED', name='poststatus'), server_default='draft', nullable=False))

尝试升级数据库后,出现以下错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "poststatus" does not exist
LINE 1: ALTER TABLE posts ADD COLUMN status poststatus DEFAULT 'draf...
                                            ^
 [SQL: "ALTER TABLE posts ADD COLUMN status poststatus DEFAULT 'draft' NOT NULL"]

  1. 为什么类型poststatus没有在数据库层面自动创建?在类似的迁移中是这样的。
  2. 如何正确指定server_default选项?我需要ORM级别的默认值和数据库级别的默认值,因为我正在修改现有的行,所以ORM的默认值不会应用。
  3. 为什么数据库中的实际值是'DRAFT','APPROVE','PUBLISHED',而不是draft等?我认为应该是ENUM的值,而不是名称。

提前谢谢。

0