require_relative '20100905201547_create_blocks'
class FixupCreateBlock < ActiveRecord::Migration
def change
revert CreateBlock
create_table(:apples) do |t|
t.string :variety
end
end
end
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
(... 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
13 回答
要回滚上次迁移,您可以执行以下操作:
如果要使用版本回滚特定迁移,则应执行以下操作:
对于例如如果版本是20141201122027,您将执行以下操作:
回滚特定的迁移 .
在rails 5中,rake db:migrate:status或rails db:migrate:status非常简单
它被修改为以相同的方式处理然后只选择要回滚的版本,然后运行rake db:migrate VERSION = 2013424230423
确保VERSION全是大写字母
如果您在迁移的任何步骤中遇到问题或卡在中间,只需转到迁移文件并注释掉已迁移的行 .
希望有所帮助
迁移使用该命令更改数据库的状态
我们可以使用撤消单个迁移步骤
要一直回到开头,我们可以使用
正如您可能猜到的那样,将任何其他数字替换为0会迁移到该版本号,其中版本号来自按顺序列出迁移
回滚上次迁移:
回滚最后
n
次迁移回滚特定的迁移
rake db:migrate:down VERSION=your_migrations's_version_number_here
版本是迁移文件名的数字前缀
How to find version :
您的迁移文件存储在
rails_root/db/migrate
目录中 . 找到要回滚的相应文件并复制前缀编号 .例如
文件名:
20140208031131_create_roles.rb
那么版本是20140208031131
您可以使用带有不同选项的
rake db:rollback
来回滚迁移 .但是,根据您的要求,语法已经改变 .
如果要回滚上次迁移,则可以使用它 .
要么
如果您想要一次性回滚迁移次数,那么您只需传递参数
其中
n
是从最新迁移回滚的迁移数 .如果要回滚特定迁移,则应在下一语法中传递迁移版本 .
其中xxxxx是迁移的版本号 .
如果它是可逆迁移并且最后一个已执行,则运行
rake db:rollback
. 而且你总是可以使用版本 . 例如迁移文件是20140716084539_create_customer_stats.rb,因此rollback命令将为
rake db:migrate:down VERSION=20140716084539
将回滚特定文件 .
要查找所有迁移的版本,可以使用以下命令:
或者,只是迁移文件名的前缀是您需要回滚的版本 .
有关迁移的信息,请参阅the Ruby on Rails guide entry .
如果要回滚和迁移,可以运行:
这与以下相同:
要回滚上次迁移,您可以执行以下操作:
如果要使用版本回滚特定迁移,则应执行以下操作:
如果要回滚的迁移文件名为
db/migrate/20141201122027_create_some_table.rb
,则该迁移的VERSION为20141201122027
,这是创建该迁移的时间戳,并且回滚该迁移的命令将为:从Rails Guide
还原以前的迁移
您可以使用Active Record的功能使用
revert
方法回滚迁移:revert
方法还接受一个反转指令块 . 这可以用于还原先前迁移的选定部分 . 例如,让我们假设CreateBlock已提交,后来决定最好使用Active Record验证代替CHECK约束来验证zipcode .也可以在不使用revert的情况下编写相同的迁移,但这将涉及更多步骤:颠倒create_table的顺序和可逆,用drop_table替换create_table,最后用down替换,反之亦然 . 这都是通过还原来处理的 .
要回滚 all migrations up to a particular version (例如
20181002222222
),请使用:(请注意,这使用
db:migrate
- 而不是db:migrate:down
,就像在这个问题的其他答案中一样 . )假设指定的迁移版本早于当前版本,这将回滚所有迁移,但不包括指定的版本 .
例如,如果
rake db:migrate:status
最初显示:运行:
将导致:
参考:https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations
如果要回滚的迁移是最后一次应用,则可以使用此方法 . 您可以将1替换为您想要返回的许多迁移 .
例如:
还将回滚稍后发生的所有迁移(4,3,2和1) .
正如评论中所建议:
为了回滚特定的迁移用途: