Alembic:如何在迁移脚本中添加新的枚举类型而无需诉诸“ alembic.op.execute”

我正在尝试在Alembic上创建新的迁移,该迁移将新Enum类型的新列添加到现有表中。但是我遇到了一个错误,我以为Alembic会自动处理。

我正在使用Postgres 9.6.6,Alembic 0.9.10和SQLAlchemy 1.2.9。

我的脚本中包含以下内容:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.add_column(
        "task",sa.Column(
            "task_type",sa.Enum(
                "train","predict","refresh",name="tasktypeenum"
            ),nullable=True,),)
    # ### end Alembic commands ###

当我尝试应用此迁移脚本时,这是堆栈跟踪的结尾(其余仅来自SQLAlchemy):

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "tasktypeenum" does not exist
LINE 1: ...task ADD COLUMN task_type tasktypeen...
                                     ^
[SQL: 'ALTER TABLE task ADD COLUMN task_type tasktypeenum'] (Background on this error at: http://sqlalche.me/e/f405)

但是,在旧的迁移文件中我们有类似的语句,可以正常工作。我看到的唯一区别是它们嵌套在op.create_table中。

我知道我可以通过执行op.execute("CREATE TYPE ...")来解决此问题,但是我想知道是否存在使用Alembic功能的解决方案。

感谢您的指导!

hongxiu1016 回答:Alembic:如何在迁移脚本中添加新的枚举类型而无需诉诸“ alembic.op.execute”

您可以执行以下操作:

task_type_enum = sa.Enum("train","predict","refresh",name="tasktypeenum")

def upgrade():
    task_type_enum.create(op.get_bind())
    op.add_column("task",sa.Column("task_type",task_type_enum,nullable=True))

def downgrade():
    op.drop_column("task","task_type")
    task_type_enum.drop(op.get_bind())
本文链接:https://www.f2er.com/2981799.html

大家都在问