我有以下迁移文件db\migrate\20100905201547_create_blocks.rb
如何专门回滚该迁移文件?
我有以下迁移文件db\migrate\20100905201547_create_blocks.rb
如何专门回滚该迁移文件?
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
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:rollback
不同的选项回滚迁移。语法将根据您的要求而有所不同。
如果您只想回滚最后一次迁移,那么您可以使用
rake db:rollback
或者
rake db:rollback STEP=1
如果您想一次回滚迁移数量,那么您只需传递一个参数:
rake db:rollback STEP=n
其中n
是要回滚的迁移数,从最新迁移开始计算。
如果要回滚到特定迁移,则应通过以下方式传递迁移版本:
rake db:migrate:down VERSION=xxxxx
其中 xxxxx 是迁移的版本号。
rake db:migrate:down VERSION=your_migrations's_version_number_here
版本是迁移文件名的数字前缀
如何找到版本:
您的迁移文件存储在您的rails_root/db/migrate
目录中。找到要回滚到的相应文件并复制前缀编号。
例如
文件名:20140208031131_create_roles.rb
那么版本是20140208031131
回滚上次迁移:
# 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
如果是可逆迁移并且是最后一个已执行的迁移,则运行rake db:rollback
. 而且您始终可以使用版本。例如
迁移文件是 20140716084539_create_customer_stats.rb,所以回滚命令是,
rake db:migrate:down VERSION=20140716084539
您可以使用 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 和 reversible 的顺序,将 create_table 替换为 drop_table,最后将 up 替换为 down,反之亦然。这一切都由revert处理。
迁移使用命令更改数据库的状态
$ bundle exec rake db:migrate
我们可以使用撤消单个迁移步骤
$ bundle exec rake db:rollback
要一直回到开头,我们可以使用
$ bundle exec rake db:migrate VERSION=0
正如您可能猜到的那样,将任何其他数字替换为 0 会迁移到该版本号,其中版本号来自按顺序列出的迁移
如果要回滚和迁移,可以运行:
rake db:migrate:redo
这与以下内容相同:
rake db:rollback
rake db:migrate
那么在 rails 5 很容易 rake db:migrate:status 或 rails db:migrate:status
它被修改为以相同的方式处理然后只需选择要回滚的版本,然后运行 rake db:migrate VERSION=2013424230423
确保 VERSION 全部为大写字母
如果您在迁移的任何步骤中遇到问题或卡在中间,只需转到迁移文件并注释掉已经迁移的行。
希望有帮助
此外
发生的事情是,我在一个较大的 Rails 应用程序中工作,其中包含一千多个迁移文件。而且,我们需要一个月的时间才能发布一个中型功能。我正在开发一个功能,一个月前我已经部署了一个迁移,然后在审查过程中迁移的结构和文件名发生了变化,现在我尝试部署我的新代码,构建失败说
ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR: column "my_new_field" of relation "accounts" already exists
上述解决方案都不适合我,因为缺少旧的迁移文件,并且我打算在新迁移文件中创建的字段已经存在于数据库中。对我有用的唯一解决方案是:
scp
将文件编辑到服务器rails console
AddNewMyNewFieldToAccounts.new.down
然后我可以再次运行部署构建。
希望对你也有帮助。
For multiple databases configurations (RoR >= v6), you must append the database name in the command, like:
rails db:rollback:primary
, where primary is the name of the database in your config/databases.yml
file, to rollback the last migration. You can make usage of the STEPS attribute here, as usual.rails db:rollback:primary VERSION=your_migration_timestamp
, to rollback only the provided migration version. Here primary is the name of the database too.