如何回滚特定的迁移?

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

如何具体回滚该迁移文件?

651665 次浏览
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: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

如果它是可逆迁移并且是最后一个已执行的迁移,则运行rake db:rollback。您可以始终使用版本。e. g

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

要回滚上次迁移,您可以执行以下操作:

rake db:rollback

如果您想使用版本回滚特定迁移,您应该执行以下操作:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

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

rake db:migrate:down VERSION=20141201122027

回滚该特定迁移。

要回滚上次迁移,您可以执行以下操作:

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

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

rake db:migrate:redo

这与:

rake db:rollbackrake db:migrate

Rails指南

恢复以前的迁移

您可以使用Active Records的功能使用revert方法回滚迁移:

require_relative '20100905201547_create_blocks'
class FixupCreateBlock < ActiveRecord::Migrationdef changerevert CreateBlock
create_table(:apples) do |t|t.string :varietyendendend

revert方法还接受要反转的指令块。这对于恢复以前迁移的选定部分很有用。例如,让我们假设CreateBlock已提交,后来决定最好使用Active Records验证来代替CHECK约束来验证邮政编码。

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migrationdef changerevert do# copy-pasted code from CreateBlockreversible do |dir|dir.up do# add a CHECK constraintexecute <<-SQLALTER TABLE distributorsADD CONSTRAINT zipchkCHECK (char_length(zipcode) = 5);SQLenddir.down doexecute <<-SQLALTER TABLE distributorsDROP CONSTRAINT zipchkSQLendend
# The rest of the migration was okendendend

同样的迁移也可以在不使用还原的情况下编写,但这需要更多的步骤:颠倒create_table和可逆的顺序,用drop_table替换create_table,最后用down替换up,反之亦然。

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

$ bundle exec rake db:migrate

我们可以撤消一个单一的迁移步骤

  $ bundle exec rake db:rollback

回到起点,我们可以用

  $ bundle exec rake db:migrate VERSION=0

正如您可能猜到的那样,将任何其他数字替换为0会迁移到该版本号,其中版本号来自按顺序列出迁移

在Rails 5中,这很容易rake db:迁移:状态或rails db:迁移状态

它被修改为以相同的方式处理两者然后选择您要回滚的版本然后跑掉rake db:迁移版本=2013424230423

确保VERSION都是大写字母

如果您在迁移的任何步骤中遇到问题或卡在中间,只需转到迁移文件并注释掉已经迁移的行。

希望有帮助

回滚上次迁移:

# rails < 5.0rake db:rollback
# rails >= 5.0rake db:rollback# orrails db:rollback

回滚上次n迁移次数

# rails < 5.0rake db:rollback STEP=2
# rails >= 5.0rake db:rollback STEP=2# orrails db:rollback STEP=2

回滚特定迁移

# rails < 5.0rake db:migrate:down VERSION=20100905201547
# rails >= 5.0rake db:migrate:down VERSION=20100905201547# orrails db:migrate:down VERSION=20100905201547

要回滚到特定版本的所有迁移(例如20181002222222),请使用:

rake db:migrate VERSION=20181002222222

(请注意,这使用db:migrate-而不是这个问题的其他答案中的db:migrate:down

假设指定的迁移版本早于当前版本,这将回滚所有迁移,直到但不包括指定版本。

例如,如果rake db:migrate:status最初显示:

  (... some older migrations ...)up      20181001002039  Some migration descriptionup      20181002222222  Some migration descriptionup      20181003171932  Some migration descriptionup      20181004211151  Some migration descriptionup      20181005151403  Some migration description

运行:

rake db:migrate VERSION=20181002222222

将导致:

  (... some older migrations ...)up      20181001002039  Some migration descriptionup      20181002222222  Some migration descriptiondown    20181003171932  Some migration descriptiondown    20181004211151  Some migration descriptiondown    20181005151403  Some migration description

参考:https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations

此外

当您很久以前部署的迁移不允许您迁移新的迁移时。

发生的事情是,我在一个更大的Rails应用程序中工作,其中包含一千多个迁移文件。而且,我们需要一个月的时间来发布一个中等大小的功能。我正在开发一个功能,一个月前我部署了一个迁移,然后在审查过程中迁移的结构和文件名发生了变化,现在我尝试部署我的新代码,构建失败说

ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR:  column "my_new_field" of relation "accounts" already exists

上述解决方案都不适合我,因为旧的迁移文件丢失了,我打算在新迁移文件中创建的字段已经存在于数据库中。唯一适合我的解决方案是:

  1. scp将文件发送到服务器
  2. 我打开了rails console
  3. 我在IRB会议上需要这份文件
  4. 然后AddNewMyNewFieldToAccounts.new.down

然后我可以再次运行部署构建。

希望它也能帮助你。

对于多个数据库配置(RoR>=v6),您必须在命令中附加库名,例如:

  • rails db:rollback:primary,其中初级config/databases.yml文件中数据库的名称,用于回滚上次迁移。您可以像往常一样在此处使用STEPS属性。
  • rails db:migrate:down:primary VERSION=your_migration_timestamp,仅恢复提供的迁移版本。这里初级也是数据库的名称。

我发现这些步骤非常有用。

要检查状态,请运行rails db:migrate:status。然后您将清楚地看到要删除的迁移。

然后,运行rails db:rollback逐一恢复更改。这样做之后,您可以再次检查状态以完全确定。

接下来,如果您想删除或删除。运行rails d migration <migration_name>。这将清理您创建的版本。

完成后,您可以继续进行新的更改。

如果您使用RAILS 3

步骤:1(检查最后一次迁移)

bundle exec rake db:migrate:status

步骤:2(回滚最后一次迁移)

bundle exec rake db:rollback

现在,您可以一个接一个地恢复安全迁移。

针对特定移民

rails d migration <migration_name>

用于恢复多个迁移

bundle exec rake db:rollback STEP=n

使用n您要回滚多少个迁移

示例:bundle exec rake db:rollback STEP=5

如果你想从上次迁移恢复使用rake db:回滚命令这对我来说很好!