gpt4 book ai didi

python - 如何手动生成更新枚举列的 alembic 迁移脚本

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:43 25 4
gpt4 key购买 nike

我正在使用的技术:

  • python 3.6
  • postgres 10.4
  • flask
  • flask 迁移
  • 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) 使用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)。

关于python - 如何手动生成更新枚举列的 alembic 迁移脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com