提问



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


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

最佳参考


rake db:rollback STEP=1


如果要回滚的迁移是最后一次应用,则可以使用此方法。您可以将1替换为您想要返回的许多迁移。


例如:


rake db:rollback STEP=5


还将回滚稍后发生的所有迁移(4,3,2和1)。


正如评论中所建议:


为了回滚特定的迁移用途:


rake db:migrate:down VERSION=20100905201547

其它参考1


rake db:migrate:down VERSION=20100905201547


将回滚特定文件。





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


rake db:migrate:status


或者,简单地说,迁移文件名的前缀是您需要回滚的版本。





请参阅有关迁移的Ruby on Rails指南条目。[40]

其它参考2


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


rake db:rollback


如果要使用版本回滚特定迁移,则应执行以下操作:


rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION


对于例如如果版本是20141201122027,您将执行以下操作:


rake db:migrate:down VERSION=20141201122027


回滚特定的迁移。

其它参考3


rake db:migrate:down VERSION=your_migrations's_version_number_here


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


如何查找版本:


您的迁移文件存储在rails_root/db/migrate目录中。找到要回滚的相应文件并复制前缀编号。


例如


档案名称:20140208031131_create_roles.rb
然后版本是20140208031131

其它参考4


您可以使用rake db:rollback使用不同选项来回滚迁移。


但是,根据您的要求,语法已经改变。


如果要回滚上次迁移,则可以使用它。


rake db:rollback


要么


rake db:rollback STEP=1


如果您想要一次性回滚迁移次数,那么您只需传递参数


rake db:rollback STEP=n


其中n是从最新迁移回滚的迁移数。


如果要回滚特定迁移,则应在下一语法中传递迁移版本。


rake db:migrate:down VERSION=xxxxx


其中xxxxx是迁移的版本号。

其它参考5


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


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


回滚上次迁移:


# 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

其它参考7


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


迁移文件是20140716084539_create_customer_stats.rb,因此rollback命令将是,
rake db:migrate:down VERSION=20140716084539

其它参考8


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


$ bundle exec rake db:migrate


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


  $ bundle exec rake db:rollback


要一直回到开头,我们可以使用


  $ bundle exec rake db:migrate VERSION=0


正如您可能猜到的,将任何其他数字替换为0会迁移到该版本号,其中版本号来自按顺序列出迁移

其它参考9


来自Rails指南[41]


还原以前的迁移



您可以使用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


也可以在不使用revert的情况下编写相同的迁移,但这将涉及更多步骤:颠倒create_table的顺序和可逆,用drop_table替换create_table,最后用down替换,反之亦然。这都是通过还原来处理的。

其它参考10


在轨道5中,这很容易
rake db:migrate:status
要么
rails db:migrate:status


它被修改为以同样的方式处理
然后选择要回滚的版本
然后跑
rake db:migrate VERSION=2013424230423


确保VERSION全是大写字母


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


希望有所帮助

其它参考11


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


rake db:migrate:redo


这与以下相同:


rake db:rollback
rake db:migrate