如何回滚特定的迁移?


806

我有以下迁移文件 db\migrate\20100905201547_create_blocks.rb

如何专门回滚该迁移文件?


1
这可以解决问题吗?您只需要执行Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich 2010年

4
在迁移每个信息在这里
Nishutosh夏尔马

1
您是否只想回退单个特定的迁移(即使之后有新的迁移)?还是要将数据库回滚到应用迁移和任何后续迁移之前的状态?
乔恩·施耐德

Answers:


1339
rake db:rollback STEP=1

如果您要回滚的迁移是最后一次应用,则这是一种方法。您可以用1代替要返回的许多迁移。

例如:

rake db:rollback STEP=5

还将回滚以后发生的所有迁移(4、3、2以及1)。

要将所有迁移回滚到(包括)目标迁移,请使用:(在所有注释指出原始帖子中的错误之后,添加了此更正的命令)

rake db:migrate VERSION=20100905201547

为了仅回滚一个特定的迁移(无序),请使用:

rake db:migrate:down VERSION=20100905201547

请注意,这不会回滚任何中间的迁移-仅列出其中的一个。如果这不是您想要的,则可以安全地运行rake db:migrate,它将仅重新运行该计算机,而跳过以前未回滚的其他计算机。

而且,如果您想不按顺序迁移单个迁移,则也有相反的做法db:migrate:up

rake db:migrate:up VERSION=20100905201547

14
“为了回滚到特定版本”-跟随的命令不是仅回滚特定的迁移,而不是回滚到该版本吗?
Andrew Grimm

10
“为了回滚到特定版本,使用...” 这个答案是不正确的!如其他答案所述,这将隔离回滚迁移。
Rhys van der Waerden's

3
警告:我犯了这个错误:仅使用rake db:migrate:down VERSION = 20100905201547在隔离中回滚!!!一个迁移文件。上面的评论中提到了这一点,但我错过了。
pixelearth

3
另一个警告词-永远不要做STEP=-1。我做了一次,然后就发疯了,回滚了一切。不是很好!这是Rails 4.2-我想现在可能已经修复了。
戴夫·哈特诺尔

1
在我的博客中写了一篇有关迁移的文章,其中解释了如何以及何时使用这些命令:railsguides.net/polish-rails-migrations
ka8725 '18

867
rake db:migrate:down VERSION=20100905201547

将回滚特定文件。


要查找所有迁移的版本,可以使用以下命令:

rake db:migrate:status

或者,只是迁移文件名的前缀就是您需要回滚的版本。


有关迁移,请参见Ruby on Rails指南条目


48
我认为绝对是首选答案。
streetlogics

30
值得一提的是,如果您回滚特定的迁移并且不希望它在即将到来的rake任务上重新迁移,那么也要删除迁移文件。
BradGreens

4
注意:如果up迁移从未成功,而仅部分执行,则down不会执行任何操作。
cyrilchampier 2013年

1
@nerith,仅对不支持事务性DDL的数据库可能是正确的。MySQL不支持事务DDL:dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL作用:wiki.postgresql.org/wiki/... 因此,如果你在MySQL数据库迁移被打破那么您必须手动删除成功的部分迁移。
2014年

1
关于@BradGreens评论的另一观察。如果确实要删除迁移文件,并且该迁移文件已被部署,则在提交带有删除文件的代码之前,您需要回滚生产/暂存。否则,您将无法回滚/迁移:向下。
AdamT

57

要回滚上一次迁移,您可以执行以下操作:

rake db:rollback

如果要回滚特定版本的迁移,请执行以下操作:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

例如,如果版本为20141201122027,则可以执行以下操作:

rake db:migrate:down VERSION=20141201122027

回滚该特定迁移。


32

您可以使用rake db:rollback不同的选项来回滚迁移。语法会根据您的要求而有所不同。

如果只想回滚上一次迁移,则可以使用其中一个

rake db:rollback

要么

rake db:rollback STEP=1

如果要一次回滚迁移的数量,则只需传递一个参数:

rake db:rollback STEP=n

n从最新迁移算起,要回滚的迁移数在哪里。

如果要回滚到特定的迁移,则应在下面传递迁移的版本:

rake db:migrate:down VERSION=xxxxx

其中xxxxx是迁移的版本号。


1
加上:down虽然不能正常工作,正确的答案是不停机
Elta3lab '19

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

版本是迁移文件名上的数字前缀

如何查找版本

您的迁移文件存储在rails_root/db/migrate目录中。查找要回滚到的适当文件,然后复制前缀号。

例如

文件名:20140208031131_create_roles.rb 则版本为20140208031131


6
查找迁移ID的最简单方法是运行rake db:migrate:status
Aeradriel

18

回滚上一次迁移:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

回滚上一次n迁移

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

回滚特定的迁移

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

要回滚上一次迁移,您可以执行以下操作:

rake db:rollback

如果要回滚特定版本的迁移,请执行以下操作:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

如果调用了您要回滚的迁移文件db/migrate/20141201122027_create_some_table.rb,则该迁移的VERSION为20141201122027,这是创建该迁移的时间的时间戳,回滚该迁移的命令为:

rake db:migrate:down VERSION=20141201122027

6

如果是可逆迁移,并且已执行了最后一个迁移,则运行rake db:rollback。而且您可以随时使用版本。例如

迁移文件为20140716084539_create_customer_stats.rb,因此回滚命令为: rake db:migrate:down VERSION=20140716084539


6

要将所有迁移回滚到特定版本(例如20181002222222),请使用:

rake db:migrate VERSION=20181002222222

(请注意,这使用db:migrate-而不是db:migrate:down此问题的其他答案。)

假设指定的迁移版本早于当前版本,这将回滚所有迁移,直到但不包括指定的版本。

例如,如果rake db:migrate:status最初显示:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

运行:

rake db:migrate VERSION=20181002222222

将导致:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

参考:https : //makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

Rails指南

恢复以前的迁移

您可以使用Active Record通过以下revert方法回滚迁移的功能:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

revert方法还接受要反转的指令块。这对于还原先前迁移的选定部分可能很有用。例如,让我们假设CreateBlock已提交,然后决定最好使用Active Record验证代替CHECK约束来验证邮政编码。

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

也可以在不使用还原的情况下编写相同的迁移,但这将涉及更多的步骤:反转create_table和reversible的顺序,用drop_table替换create_table,最后用down替换,反之亦然。全部由还原来处理。


3

迁移使用以下命令更改数据库的状态

$ bundle exec rake db:migrate

我们可以使用撤消单个迁移步骤

  $ bundle exec rake db:rollback

从头开始,我们可以使用

  $ bundle exec rake db:migrate VERSION=0

您可能会猜到,用其他任何数字替换0都会迁移到该版本号,该版本号来自于按顺序列出迁移


2

在Rails 5中,很容易使用rake db:migrate:status或rails db:migrate:status

对其进行了修改,使其以相同的方式处理,然后只需选择要回滚的版本,然后运行rake db:migrate VERSION = 2013424230423

确保版本全部为大写字母

如果您在迁移的任何步骤上遇到问题或陷入中间,只需转到迁移文件并注释掉已迁移的行即可。

希望能有所帮助


1
我突出显示了命令rake db:migrate:status的提示。。。概述非常有用,可以查看迁移文件的当前执行状态。
美女

1

如果要回滚和迁移,可以运行:

rake db:migrate:redo

等同于:

rake db:rollback
rake db:migrate
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.