这是我的Post模型:
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"]
- 为什么
poststatus
类型没有自动在数据库层面创建? 在类似的迁移中是这样做的。 - 如何正确指定
server_default
选项? 我需要ORM级别和DB级别的默认值,因为我正在修改现有行,因此ORM默认值不适用。 - 为什么DB中的实际值是'DRAFT'、'APPROVE'、'PUBLISHED'而不是
draft
等? 我认为应该是枚举值,而不是名称。
谢谢你提前。