提问人:Taras 提问时间:8/10/2023 更新时间:8/12/2023 访问量:140
如何处理 Rails 部署过程中迁移失败的问题?
How to deal with failed migrations during deployment in Rails?
问:
为了随着时间的推移发展数据库架构,我们需要进行数据库迁移。Rails 为我们提供了强大的功能来做到这一点。众所周知,Rails 中的每次迁移都封装在一个 DDL 事务中(至少对于 Postgres 而言)。这意味着,如果某些迁移在中途失败,则与此迁移相关的所有更改都将回滚。但是,我注意到,如果我们有多个迁移,并且其中一个失败,那么以前的迁移将不会回滚。这在生产部署方面是一个问题,因为迁移的新部分可以部分完成。
假设我们有 5 个新的迁移,我们想要将其部署到生产环境中。
migration_1.rb
migration_2.rb
migration_3.rb
migration_4.rb
migration_5.rb
例如,如果发生错误,则不会回滚所有以前的迁移 (, , )。migration_4.rb
migration_1.rb
migration_2.rb
migration_3.rb
我应该如何处理这种情况?
我有一个想法,通过这样的方式取消代码部署并回滚以前的迁移
rails db:rollback STEP=n # n - number of migrations that managed to pass successfully
但是我还有另一个问题 - 如果在回滚过程中发生错误怎么办?
答:
我建议的最佳做法是:每次部署只进行一次迁移。迁移在事务中运行,因此,如果单个迁移失败,则不会造成任何损害,假设整个部署都失败了(因此您最终不会部署依赖于失败迁移的代码更改)。
但是,如果一个成功而下一个失败,则数据库最终将处于您不希望的状态,您将不得不手动回滚。
如果多个迁移相互关联,并且需要作为一个迁移进行部署,只需将它们重构为单个迁移文件即可。如果它们属于可以单独部署的单独功能,请改为执行此操作。
关于回滚失败 - 迁移应始终能够回滚,这应该是开发过程的一部分。例如,如果迁移数据,请确保将其迁移回版本中。down
测试这一点的一种简单方法是在本地使用。在提交迁移之前,最好始终这样做。db:migrate:redo
评论