我有以下迁移文件 db\migrate\20100905201547_create_blocks.rb
如何专门回滚该迁移文件?
我有以下迁移文件 db\migrate\20100905201547_create_blocks.rb
如何专门回滚该迁移文件?
Answers:
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
STEP=-1
。我做了一次,然后就发疯了,回滚了一切。不是很好!这是Rails 4.2-我想现在可能已经修复了。
rake db:migrate:down VERSION=20100905201547
将回滚特定文件。
要查找所有迁移的版本,可以使用以下命令:
rake db:migrate:status
或者,只是迁移文件名的前缀就是您需要回滚的版本。
有关迁移,请参见Ruby on Rails指南条目。
您可以使用rake db:rollback
不同的选项来回滚迁移。语法会根据您的要求而有所不同。
如果只想回滚上一次迁移,则可以使用其中一个
rake db:rollback
要么
rake db:rollback STEP=1
如果要一次回滚迁移的数量,则只需传递一个参数:
rake db:rollback STEP=n
n
从最新迁移算起,要回滚的迁移数在哪里。
如果要回滚到特定的迁移,则应在下面传递迁移的版本:
rake db:migrate:down VERSION=xxxxx
其中xxxxx是迁移的版本号。
回滚上一次迁移:
# 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:rollback
如果要回滚特定版本的迁移,请执行以下操作:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
如果调用了您要回滚的迁移文件db/migrate/20141201122027_create_some_table.rb
,则该迁移的VERSION为20141201122027
,这是创建该迁移的时间的时间戳,回滚该迁移的命令为:
rake db:migrate:down VERSION=20141201122027
要将所有迁移回滚到特定版本(例如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
您可以使用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替换,反之亦然。全部由还原来处理。
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file