【问题标题】:Merging multiple migration files into one migration file [closed]将多个迁移文件合并到一个迁移文件中[关闭]
【发布时间】:2020-02-25 08:18:52
【问题描述】:

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

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

这是我的方法。

  • 手动删除最后 3 个迁移文件并将其内容复制到第一个文件中。
  • 在开发服务器上再次部署应用

我的疑惑:

  • 手动删除文件就够了吗?
  • 此外,迁移已经在开发服务器上运行,所以开发服务器会重新运行第一个迁移文件,还是真的需要这样做?

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

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-rails rails-migrations


【解决方案1】:

保留四个迁移文件应该没有问题,但如果您想将迁移文件合并为一个,那么首先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 命令来完成这项工作。

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

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2016-02-03
    • 2012-04-12
    • 2013-03-03
    • 2014-09-17
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多