如何回滚特定的迁移?

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

我怎样才能专门回滚迁移文件?

 rake db:rollback STEP=1 

如果您想要回滚的迁移是最后一个应用,则可以这样做。 你可以用1代替你想要返回的许多迁移。

例如:

 rake db:rollback STEP=5 

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

正如评论中所build议:

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

 rake db:migrate:down VERSION=20100905201547 
 rake db:migrate:down VERSION=20100905201547 

将回滚特定的文件。


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

 rake db:migrate:status 

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


查看关于迁移的Ruby on Rails指南条目 。

要回滚上次的迁移,你可以这样做:

 rake db:rollback 

如果你想回滚一个特定的版本,你应该这样做:

 rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION 

例如,如果版本是20141201122027,您将执行:

 rake db:migrate:down VERSION=20141201122027 

回滚特定的迁移。

rake db:migrate:down VERSION=your_migrations's_version_number_here

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

如何查找版本

您的迁移文件存储在您的rails_root/db/migrate目录中。 find合适的文件,然后复制前缀号码。

例如

文件名: 20140208031131_create_roles.rb那么版本是20140208031131

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

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

如果你想回滚上次迁移,那么你可以使用它。

 rake db:rollback 

要么

 rake db:rollback STEP=1 

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

 rake db:rollback STEP=n 

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

如果您想要回滚特定的迁移,那么您应该在下一个语法中通过迁移版本。

 rake db:migrate:down VERSION=xxxxx 

其中xxxxx是迁移的版本号。

要回滚上次的迁移,你可以这样做:

 rake db:rollback 

如果你想回滚一个特定的版本,你应该这样做:

 rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION 

如果要回滚的迁移文件名为db/migrate/20141201122027_create_some_table.rb ,则该迁移的VERSION为20141201122027 ,该时间戳是创build迁移的时间戳,并且回滚该迁移的命令为:

 rake db:migrate:down VERSION=20141201122027 

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

迁移文件是20140716084539_create_customer_stats.rb,所以回滚命令将是rake db:migrate:down VERSION=20140716084539

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

 $ bundle exec rake db:migrate 

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

  $ bundle exec rake db:rollback 

一路走回头,我们可以用

  $ bundle exec rake db:migrate VERSION=0 

正如您可能猜到的,将任何其他数字replace为0会迁移到该版本号,其中版本号来自依次列出迁移

从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 Recordvalidation代替CHECK约束来validation邮政编码。

  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_tablereplacecreate_table,最后使用down来replace,反之亦然。 这一切都由恢复照顾。

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

它被修改,以同样的方式处理然后,只需select要回滚哪个版本,然后运行耙数据库:migrate VERSION = 2013424230423

确保VERSION全部是大写字母

如果您在迁移过程中遇到任何问题或者遇到问题,请转到迁移文件并注释已迁移的行。

希望有所帮助

回滚最后的迁移:

 # 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 

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

 rake db:migrate:redo 

这是一样的:

 rake db:rollback rake db:migrate