相关疑难解决方法(0)

使用Alembic更改Enum字段

当使用早于9.1的PostgreSQL版本(为枚举添加ALTER TYPE)时,如何在alembic迁移中向Enum字段添加元素?这个 SO问题解释了直接过程,但我不太确定如何使用alembic进行翻译.

这就是我所拥有的:

new_type = sa.Enum('nonexistent_executable', 'output_limit_exceeded',
                   'signal', 'success', 'timed_out', name='status')
old_type = sa.Enum('nonexistent_executable', 'signal', 'success', 'timed_out',
                   name='status')
tcr = sa.sql.table('testcaseresult',
                   sa.Column('status', new_type, nullable=False))


def upgrade():
    op.alter_column('testcaseresult', u'status', type_=new_type,
                    existing_type=old_type)


def downgrade():
    op.execute(tcr.update().where(tcr.c.status==u'output_limit_exceeded')
               .values(status='timed_out'))
    op.alter_column('testcaseresult', u'status', type_=old_type,
                    existing_type=new_type)
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面只ALTER TABLE testcaseresult ALTER COLUMN status TYPE status在升级时产生,基本上什么也没做.

python postgresql sqlalchemy alembic

39
推荐指数
6
解决办法
2万
查看次数

如何在SQLAlchemy和Alembic中使用Enum?

这是我的Post模型:

class Post(Base):
    __tablename__ = 'posts'

    title = db.Column(db.String(120), nullable=False)
    description = db.Column(db.String(2048), nullable=False)
Run Code Online (Sandbox Code Playgroud)

我想在其中添加枚举status。因此,我创建了一个新的Enum:

import enum

class PostStatus(enum.Enum):
    DRAFT='draft'
    APPROVE='approve'
    PUBLISHED='published'
Run Code Online (Sandbox Code Playgroud)

并为模型添加了一个新字段:

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

完成后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))
Run Code Online (Sandbox Code Playgroud)

尝试升级数据库后,我得到:

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' …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy alembic

6
推荐指数
4
解决办法
3746
查看次数