首页 > 解决方案 > 将多个迁移文件合并为一个迁移文件

问题描述

我在本地环境中有 4 个迁移文件。我已经在开发服务器上部署了这个应用程序(所以 4 迁移已经影响了开发服务器数据库)。我还没有在生产服务器中部署这些迁移。

所有 4 个迁移都是相关的,我想将它们合并到一个迁移文件中。

这是我的方法。

我的疑惑:

这是迁移文件(如果需要):

change_column :slots, :notes, :text
add_column :slots, :notestext, :text
Slot.update_all('notestext=notes')
remove_column :slots, :notes
rename_column :slots, :notestext, :notes

标签: ruby-on-railsrails-migrations

解决方案


保留四个迁移文件应该没有问题,如果您想将迁移文件合并为一个,那么首先rollback迁移将从数据库中删除所有数据,然后按照您的方法将所有内容复制到一个文件并重新运行迁移。

运行rollback是必要的,因为 Rails 永远不会运行它已经运行的迁移,Rails 使用schema_migrations数据库中的表来跟踪它,它存储它已经运行的迁移版本。此外,schema.rb 文件具有它已运行的最新版本的迁移。rollback因此,让您已经运行的迁移保持同步,并在更改后重新运行它们。

此外,如果您创建一个结合所有四个的新迁移,那么它将在数据库上出现异常,因为表已经存在。如果你在旧迁移中复制所有四个,那么你的schema_migrations表将有一些版本号,它没有与之关联的文件,运行rake db:migrate:status将给出如下输出:

   up     20191117112500  ********** NO FILE **********
   up     20191117112930  ********** NO FILE **********

所以最好回滚并重新运行迁移,这将使所有东西保持同步。要回滚四个迁移,您可以这样做:

rails db:rollback STEP=4

或者您也可以像这样检查迁移的当前状态并一一回滚:

rails db:migration:status
rails db:migration:down VERSION=<version_number>

您还可以运行该rails db:rollback命令四次来完成这项工作。

注意:这将删除您在数据库中的所有现有数据


推荐阅读