在开发和部署中使用Flask迁移

在开发和部署中使用Flask迁移,flask,flask-sqlalchemy,database-migration,continuous-deployment,flask-migrate,Flask,Flask Sqlalchemy,Database Migration,Continuous Deployment,Flask Migrate,我一直在浏览flask开发中有关使用flask Migrate进行数据库迁移的stackoverflow帖子。然而,我仍然不满意,并留下来思考用于管理开发和部署服务器的数据库迁移的最佳实践 到目前为止我学到了什么 米格尔本人建议 理想的解决方案是为您的db模式生成初始迁移,因为这是您开始使用Flask Migrate和Alembic…跟踪迁移的那天。。。只需创建一个单独的空数据库(不要使用真实数据库),将应用程序配置为使用空数据库,然后生成迁移。此迁移将包含整个架构。生成迁移后,请删除空数据库并

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

到目前为止我学到了什么 米格尔本人建议

理想的解决方案是为您的db模式生成初始迁移,因为这是您开始使用Flask Migrate和Alembic…跟踪迁移的那天。。。只需创建一个单独的空数据库(不要使用真实数据库),将应用程序配置为使用空数据库,然后生成迁移。此迁移将包含整个架构。生成迁移后,请删除空数据库并将配置恢复到真实数据库

上述实践要求我在部署服务器中创建两个数据库,一个是虚拟数据库,我在其中执行两个命令:

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
我的问题仍然存在
  • 在部署/生产环境中使用一些“活鱼”(实际数据已填充生产数据库)处理数据库迁移时,最佳做法是什么。我的问题不一定是针对
    Flask Migrate
    的,我有时会在Django中处理这个问题,更经常的是在Flask中,最后,我必须将迁移脚本完全重置为初始状态。我希望来自不同技术阶层的人能和我联系起来
  • 在fresh容器上部署时,我当前的做法是从development复制flask的migrations脚本文件夹,然后立即执行flask db升级。数据库中的表是否需要先存在?
    升级
    命令是否保证像
    db.create_all()
    一样执行创建
  • 注:关于问题2是具体的。我之所以怀疑这一点,是因为我很少在新鲜容器上使用flask db升级时出现奇怪的错误:

    Cannot create User table. Table already existed...
    
    虽然之前在fresh容器中没有表设置,但我记得不久前我使用Docker在本地部署我的应用程序时发生了这种情况。还有一次,
    flaskdb升级
    不会执行任何奇怪的表创建。请注意,我以前从未在新容器中或在开发中使用/invoke
    db.create_all()

    更新日期:2021年3月25日 已经一年了,现在我处理了很多这样的问题。执行数据库迁移确实有很多不同的方法,而这个问题并不局限于迁移

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

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

    根据经验:

    • 有上下脚本
    • Up脚本不应包含drop列或表。如果表的某一列已过时,请在迁移成功后手动删除该列,推出旧的应用程序实例,并且使用新的migration+应用程序代码一切都很稳定
    • 在up脚本中更改是可以的,但请注意更改列名或数据类型是不兼容的。小心处理。您可以创建新列,将旧列中的数据转换为新列,然后删除旧列。或者宕机也可以,只需花点时间部署与新db模式兼容的新应用程序即可
    • Down脚本不应包含create、insert或alter

    我相信你部分误解了你引用的评论,或者可能没有看到完整的答案

    迁移总是在开发数据库中生成的。生产与生成迁移无关

    如果您有一个现有数据库,并且希望生成初始迁移,则该过程是:

    • 创建一个空数据库
    • 将应用程序配置为使用此空数据库
    • 运行
      flask db migrate
      生成初始迁移
    • 切换回原始数据库
    • 在所有数据库(dev、prod等)中运行
      flask db stamp head
      ,将它们标记为已升级
    • 删除空数据库
    • 从现在起,您可以以正常方式迁移和升级数据库

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

    如果我理解正确,您定义的上述步骤是针对引用文章中的新应用程序?正确。如果您不关心初始迁移,那么您可以只进行迁移和升级,您只需跟踪后续的更改。谢谢您的回答@Miguel,您是否有在ci/cd管道上处理迁移的诀窍?@Raqib您需要一个编排系统。通常在生产环境中,您的K8(kubernetes)管道可以在新代码中滚动,并伴随新的db迁移版本。因此,您的管道有一个金丝雀来测试您的自动迁移。Github/Gitlab MR-->合并-->CI(测试+构建)管道-->在金丝雀管道中运行db迁移-->集成测试管道-->K8s产品运行自动迁移+在新应用实例中滚动-->在旧实例中滚动,这样您的编排系统(如K8)将处理在新部署中滚动和在旧实例中滚动。您可以配置数据库迁移管道。通常在许多公司,自动迁移是不可能的(他们有自己的规则)。因此,您必须向DB管理员提交DDL迁移脚本。