我有以下迁移文件db\migrate\20100905201547_create_blocks.rb
如何专门回滚该迁移文件?
答案 0 :(得分:1143)
rake db:rollback STEP=1
如果您想要回滚的迁移是最后一次应用,那么这是一种方法。您可以将1替换为您想要返回的许多迁移。
例如:
rake db:rollback STEP=5
还会回滚稍后发生的所有迁移(4,3,2和1)。
要将所有迁移回滚到(并包括)目标迁移,请使用:(在所有注释中指出原始帖子中的错误后添加了此更正的命令)
rake db:migrate VERSION=20100905201547
为了仅回滚一个特定的迁移(OUT OF ORDER),请使用:
rake db:migrate:down VERSION=20100905201547
请注意,这不会回滚任何中间迁移 - 仅列出所迁移的迁移。如果这不是您的意图,您可以安全地运行rake db:migrate
,它将仅重新运行那个,跳过之前未回滚的其他任何内容。
答案 1 :(得分:829)
rake db:migrate:down VERSION=20100905201547
将回滚特定文件。
要查找所有迁移的版本,可以使用以下命令:
rake db:migrate:status
或者,只是迁移文件名的前缀是您需要回滚的版本。
有关迁移的信息,请参阅the Ruby on Rails guide entry。
答案 2 :(得分:48)
要回滚上一次迁移,您可以执行以下操作:
rake db:rollback
如果要使用您应该执行的版本回滚特定迁移:
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
例如如果版本是20141201122027,您将执行:
rake db:migrate:down VERSION=20141201122027
回滚特定的迁移。
答案 3 :(得分:25)
您可以使用rake db:rollback
使用不同的选项来回滚迁移。根据您的要求,语法会有所不同。
如果您想仅回滚上次迁移,则可以使用
rake db:rollback
或
rake db:rollback STEP=1
如果您想一次性回滚迁移次数,那么您只需传递一个参数:
rake db:rollback STEP=n
其中n
是要回滚的迁移次数,从最新迁移开始计算。
如果要回滚到特定迁移,则应在以下内容中传递迁移版本:
rake db:migrate:down VERSION=xxxxx
其中xxxxx是迁移的版本号。
答案 4 :(得分:24)
rake db:migrate:down VERSION=your_migrations's_version_number_here
版本是迁移文件名
的数字前缀如何查找版本:
您的迁移文件存储在rails_root/db/migrate
目录中。找到要回滚的相应文件并复制前缀号。
例如
文件名:20140208031131_create_roles.rb
那么版本是20140208031131
答案 5 :(得分:13)
要回滚上一次迁移,您可以执行以下操作:
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 :(得分:13)
回滚上次迁移:
# 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 :(得分:6)
如果是可逆迁移且最后一个已执行,则运行rake db:rollback
。而且你总是可以使用版本。
e.g
迁移文件是20140716084539_create_customer_stats.rb,因此rollback命令将是,
rake db:migrate:down VERSION=20140716084539
答案 8 :(得分:3)
您可以使用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替换,反之亦然。这都是通过还原来处理的。
答案 9 :(得分:3)
迁移使用命令
更改数据库的状态$ bundle exec rake db:migrate
我们可以使用
撤消单个迁移步骤 $ bundle exec rake db:rollback
要一直回到开头,我们可以使用
$ bundle exec rake db:migrate VERSION=0
正如您可能猜到的那样,将任何其他数字替换为0会迁移到该版本号,其中版本号来自顺序列出迁移
答案 10 :(得分:2)
在导轨5中,它很容易 rake db:migrate:status 要么 rails db:migrate:status
它被修改为以同样的方式处理 然后选择要回滚的版本 然后跑 rake db:migrate VERSION = 2013424230423
确保VERSION全是大写字母
如果您对迁移的任何步骤有疑问或卡在中间,只需转到迁移文件并注释掉已迁移的行。
希望有所帮助
答案 11 :(得分:2)
要回滚所有迁移到特定版本(例如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
答案 12 :(得分:1)
如果您想要回滚和迁移,可以运行:
rake db:migrate:redo
这与:
相同rake db:rollback
rake db:migrate
答案 13 :(得分:0)
另外
发生的事情是,我在一个较大的Rails应用程序中工作,其中包含一千多个迁移文件。而且,我们要花一个月的时间才能发布中型功能。我正在开发一项功能,一个月前就部署了迁移,然后在审核过程中迁移和文件名的结构发生了变化,现在我尝试部署新代码,但编译失败。
ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR: column "my_new_field" of relation "accounts" already exists
上述解决方案中的任何一个都不对我有用,因为缺少旧的迁移文件,并且我打算在新的迁移文件中创建的字段已经存在于数据库中。对我有用的唯一解决方案是:
scp
将文件存储到服务器rails console
AddNewMyNewFieldToAccounts.new.down
然后我可以再次运行部署版本。
希望它对您也有帮助。