如何手动生成更新 Enum 列的 alembic 迁移脚本

jmi*_*rdi 4 python sqlalchemy alembic

我正在使用的技术:

  • 蟒蛇3.6
  • postgres 10.4
  • 烧瓶
  • 烧瓶迁移
  • 烧瓶_sqlalchemy

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

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 2
Run Code Online (Sandbox Code Playgroud)

(请注意重复值为 2 的拼写错误。)以下是我尝试将枚举更改为:

class EventType(Enum):
    started = 1
    completed = 2
    aborted = 3
    failed = 4
Run Code Online (Sandbox Code Playgroud)

我的更改是修复拼写错误并向枚举添加新值。

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

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(db.Enum(EventType))
Run Code Online (Sandbox Code Playgroud)

对 的调用python app.py db migrate没有检测到任何更改,并且我在文档中读到alembic(在 的底层使用flask_migrate)不会自动检测枚举更改。1

这个大约 6 年前的问题似乎表明在 Postgres 9.4 之后有更好的方法来处理这个问题

我正在寻找需要采取的具体步骤,以手动编写自己的迁移脚本或检测flask_migrate此更改并为我生成脚本。如果我需要提供更多信息来帮助回答这个问题,请告诉我。

jmi*_*rdi 6

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

1)生成一个空白修订文件python app.py db revision --message "new event types"

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

op.execute("COMMIT")
op.execute("ALTER TYPE eventtype ADD VALUE 'failed'")
Run Code Online (Sandbox Code Playgroud)

3) 按常规方式保存并应用python app.py db upgrade

笔记:

  • 这不处理拼写错误值。据我所知,Postgres 不会在任何地方存储 python 枚举值,也不关心它是什么。

  • 这不会删除downgrade()方法中的值。我找不到直接的方法来做到这一点,所以我就忽略了它。就我而言,如果降级不消除这些额外的值,我认为这并不重要。

  • eventtype我通过阅读最初创建包含该类型的表的迁移文件了解了我的类型 ( ) 的名称。