在开发和部署中使用 Flask-Migration

Using Flask-Migration in development and deployment

我一直在浏览有关使用 Flask-Migrate 进行数据库迁移的 flask 开发的 Whosebug 帖子。然而,我仍然不满意并继续思考用于管理开发和部署服务器的数据库迁移的最佳实践。

到目前为止我学到了什么

米格尔本人建议 ,

The ideal solution is that you generate an initial migration for your db schema as it was the day you started tracking migrations with Flask-Migrate and Alembic. ... Just create a separate empty database (leave your real db alone), configure your app to use the empty database, and then generate a migration. This migration will have the entire schema. Once you have that migration generated, get rid of the empty database and restore your configuration back to the real db.

上面的做法要求我在部署服务器中制作两个数据库,一个是虚拟数据库,我在其中执行两个命令:

flask db migrate # to empty dummy database
# then get rid of dummy database
# then change config (e.g. DATABASE_URI) to real deployment database
flask db upgrade # then upgrade the real database

我的问题仍然存在

  1. 在 deployment/prod 环境中处理一些“活鱼”(实际数据已经填充到生产数据库)的数据库迁移时,真正的最佳实践是什么。我的问题不必特定于 Flask-Migrate,我有时会在 Django 中处理这个问题,而在 Flask 中更常见,最后,我必须将迁移脚本完全重置为初始状态。我希望来自不同技术栈的人可以与我联系。
  2. 在新容器上部署时,我目前的做法是从开发中复制 flask 的迁移脚本文件夹,然后立即执行 flask db upgrade。数据库中的table是否需要先存在? upgrade 命令是否保证像 db.create_all() 一样执行创建?

注意:问题 2 Flask-Migrate 具体。我怀疑这是因为很少在新鲜容器上,我在 flask db upgrade:

上得到奇怪的错误
Cannot create User table. Table already existed...

虽然之前在新容器中没有 table 设置,但我记得不久前我使用 Docker 在本地部署我的应用程序时发生过这种情况。还有一次,flask db upgrade 没有执行任何 table 创建,这很奇怪。请注意,我以前从未 used/invoke db.create_all() 在新容器中或开发中。

2021 年 3 月 25 日更新

已经一年了,现在我正在处理很多这类问题。确实有很多不同的方式来执行数据库迁移,这个问题不仅仅与 Flask Migrate 有关。

任何需要关系 DBMS 作为存储的网络应用程序开发人员(Go、Python、Ruby 等)都需要考虑如何提供始终向后兼容的迁移脚本之前的数据库。

大多数时候您的代码应用程序需要随着数据库迁移的变化而变化,但这并不意味着迁移必须与应用程序部署相结合。这取决于您的开发运营政策。

根据经验:

我认为您对您引用的评论有部分误解,或者可能没有看到完整的答案。

迁移始终在您的开发数据库中生成。生产与生成迁移无关。

如果您有现有的数据库并且想要生成初始迁移,则过程为:

  • 创建一个空数据库
  • 将应用配置为使用这个空数据库
  • 运行 flask db migrate 生成初始迁移
  • 切换回原来的数据库
  • 运行 flask db stamp head 在所有数据库(开发、生产等)中将它们标记为已升级
  • 删除空数据库
  • 从现在开始,您可以正常迁移和升级数据库。

关于你的第二个问题,答案是肯定的。 Alembic(通过 Flask-Migrate)创建不存在的新表。