如何手动生成一个Alembic迁移脚本来更新Enum列

时间:2018-11-29 21:23:54

标签: python sqlalchemy alembic

我正在使用的技术:

  • python 3.6
  • postgres 10.4
  • 烧瓶
  • flask_migrate
  • flask_sqlalchemy

到目前为止,我已经依靠调用python app.py db migrate生成的自动生成的迁移脚本。然后,我通过调用python app.py db upgrade应用这些迁移脚本。但是,我最近的更改涉及修改用于创建列的枚举。这是我的枚举的简化示例:

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 2

(请注意重复值2的错字。) 这是我试图将枚举更改为的内容:

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 3
    failed = 4

我所做的更改是修正拼写错误并为枚举添加新值。

以下是使用该枚举的(简化)模型:

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.Enum(EventType))

python app.py db migrate的调用未检测到任何更改,并且我已经阅读了文档alembic(在flask_migrate的幕后使用)不会自动检测到枚举更改。 1

This来自大约6年前的问题似乎表明,在Postgres 9.4之后,有更好的方法来解决此问题。

我正在寻找需要手动执行自己的迁移脚本或获取flask_migrate来检测此更改并为我生成脚本的特定步骤。请让我知道是否需要提供更多信息来帮助回答这个问题。

1 个答案:

答案 0 :(得分:1)

这是我解决问题的最终方法:

1)使用python app.py db revision --message "new event types"

生成空白修订文件

2)通过在upgrade()方法中输入以下几行来修改新文件:

op.execute("COMMIT")
op.execute("ALTER TYPE eventtype ADD VALUE 'failed'")

3)使用python app.py db upgrade保存并应用常规方法。

注意:

  • 这不处理错字值。据我所知,Postgres不在任何地方存储python枚举值,也不在乎它是什么。

  • 这不会删除downgrade()方法中的值。我找不到简单的方法来做,所以我只是忽略了它。就我而言,如果降级不删除那些多余的值,我认为这并不重要。

  • 我通读了最初创建包含该类型的表的迁移文件,从而得知了我的类型(eventtype)的名称。