如何回滚特定迁移?

How can I rollback a specific migration?

提问人:AnApprentice 提问时间:9/6/2010 最后编辑:Timur ShtatlandAnApprentice 更新时间:9/6/2023 访问量:724597

问:

我有迁移文件db\migrate\20100905201547_create_blocks.rb

如何专门回滚该迁移文件?

Ruby-on-Rails 迁移 数据库架构

评论

2赞 danivovich 9/6/2010
这能解决问题吗?你只需要做 stackoverflow.com/questions/753919/run-a-single-migration-fileClass.down
4赞 Nishutosh Sharma 1/2/2013
有关迁移的所有信息 这里
1赞 Jon Schneider 10/4/2018
是否只想回滚单个特定迁移(即使之后有更新的迁移)?或者是否要将数据库回滚到应用该迁移以及任何后续迁移之前的状态?
0赞 rnewed_user 10/7/2022
很多时候这个命令'rails db:rollback'

答:

1763赞 Zachary Wright 9/6/2010 #1
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

评论

15赞 Andrew Grimm 7/11/2016
“为了回滚到特定版本” - 后面的命令不是只回滚特定的迁移,而不是一直回滚到该版本吗?
13赞 Rhys van der Waerden 11/22/2016
“为了回滚到特定版本,请使用...”这个答案是不正确的!这将单独回滚迁移,如其他答案所述。
7赞 pixelearth 1/27/2017
警告:我犯了这个错误:只使用 rake db:migrate:down VERSION=20100905201547 单独回滚!!一个迁移文件。这在上面的评论中提到过,但我错过了。
4赞 Dave Hartnoll 3/14/2018
另一个警告 - 永远不要这样做.我做过一次,它发疯了,回滚了一切。不好!这是 Rails 4.2 - 我想它现在可能已经修复了。STEP=-1
6赞 Danodemo 2/21/2020
别忘了,您可以使用它来查看所有特定的迁移及其状态!rake db:migrate:status
951赞 John Creamer 7/9/2011 #2
rake db:migrate:down VERSION=20100905201547

将回滚特定文件。


若要查找所有迁移的版本,可以使用以下命令:

rake db:migrate:status

或者,迁移文件名的前缀就是您需要回滚的版本。


请参阅 Ruby on Rails 指南中关于迁移的条目。

评论

51赞 streetlogics 2/28/2013
在我看来,绝对是首选答案。
32赞 BradGreens 8/21/2013
值得一提的是,如果您回滚特定迁移并且不希望它在即将到来的 rake 任务中重新迁移,那么也请删除迁移文件。
4赞 cyrilchampier 10/9/2013
注意:似乎如果向上迁移从未成功,但仅部分执行,则向下迁移不会执行任何操作。
1赞 Иван Бишевац 7/25/2014
@nerith,这可能仅适用于不支持事务性 DDL 的数据库。MySQL 不支持事务性 DDL:dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL 支持:wiki.postgresql.org/wiki/...因此,如果您在MySQL数据库上的迁移中断,则必须手动删除成功的迁移部分。
1赞 AdamT 8/6/2017
关于@BradGreens评论的另一个意见。如果确实要删除迁移文件,并且该文件已部署,则需要在使用已删除的文件提交代码之前回滚生产/暂存。否则,您将无法回滚/迁移:down。
41赞 uma 3/24/2014 #3

您可以使用不同的选项回滚迁移。语法将根据您的要求而有所不同。rake db:rollback

如果只想回滚上次迁移,则可以使用

rake db:rollback

rake db:rollback STEP=1

如果你想一次回滚迁移次数,那么你只需传递一个参数:

rake db:rollback STEP=n

其中 是要回滚的迁移数,从最新迁移开始计算。n

如果要回滚到特定迁移,则应在以下各项中传递迁移版本:

rake db:migrate:down VERSION=xxxxx

其中 xxxxx 是迁移的版本号。

评论

1赞 ELTA 10/13/2019
添加:d own是行不通的,正确答案是没有
29赞 Hardik 4/22/2014 #4

用:

rake db:migrate:down VERSION=your_migrations's_version_number_here

版本是迁移文件名上的数字前缀。

如何查找版本

迁移文件存储在目录中。找到要回滚到的相应文件并复制前缀编号。rails_root/db/migrate

例如:

文件名:20140208031131_create_roles.rb

则版本为 .20140208031131

评论

6赞 Aeradriel 3/15/2016
查找迁移 ID 的最简单方法是运行rake db:migrate:status
6赞 Santanu 7/28/2014 #5

如果是可逆迁移,并且是已执行的最后一个迁移,则运行 。而且您可以随时使用该版本。rake db:rollback

例如,如果迁移文件是 20140716084539_create_customer_stats.rb,则回滚命令将为:

rake db:migrate:down VERSION=20140716084539
70赞 Waleed 12/2/2014 #6

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

rake db:rollback

如果要使用某个版本回滚特定迁移,则应执行以下操作:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

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

rake db:migrate:down VERSION=20141201122027

以回滚该特定迁移。

14赞 Sandip Vavhal 1/6/2015 #7

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

rake db:rollback

如果要使用某个版本回滚特定迁移,应执行以下操作:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

如果要回滚的迁移文件已调用,则该迁移的 VERSION 为 ,这是创建该迁移时的时间戳,回滚该迁移的命令为:db/migrate/20141201122027_create_some_table.rb20141201122027

rake db:migrate:down VERSION=20141201122027
2赞 Iwan B. 6/12/2015 #8

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

rake db:migrate:redo

这与以下相同:

rake db:rollback
rake db:migrate
5赞 Nirupa 5/7/2016 #9

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

bundle exec rake db:migrate

我们可以使用

bundle exec rake db:rollback

要一直回到开头,我们可以使用

bundle exec rake db:migrate VERSION=0

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

评论

0赞 Peter Mortensen 1/9/2023
这个“捆绑包”是什么?OP已经离开了大楼(“最后一次露面是在3年多前”);其他人可以插话吗?
3赞 Shahin 7/21/2016 #10

嗯,在 rails 5 中,这很容易

rake db:migrate:status

rails db:migrate:status

它被修改为以相同的方式处理两者。 然后只需选择要回滚的版本 然后运行

rake db:migrate VERSION=2013424230423

确保 VERSION 全部为大写字母。

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

评论

1赞 Beauty 8/2/2017
我突出显示了命令 rake db:migrate:status 的提示。 。 。查看迁移文件的当前执行状态非常适合概述。
20赞 Deepak Mahakale 9/20/2016 #11

回滚上次迁移:

# 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
13赞 Jon Schneider 10/11/2018 #12

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

rake db:migrate VERSION=20181002222222

(请注意,这使用 -- 而不是像这个问题的其他答案一样。db:migratedb: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

参考:仅迁移或还原部分迁移

2赞 Shiva 7/8/2020 #13

此外:

如果很久以前部署的迁移不允许迁移新的迁移。

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

ActiveRecord::StatementInvalid:PG::D uplicateColumn:错误:关系“accounts”的列“my_new_field”已存在

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

  1. 我将文件编辑到服务器scp
  2. 我打开了rails console
  3. 我在 IRB 会话中需要该文件
  4. 然后AddNewMyNewFieldToAccounts.new.down

然后我可以再次运行部署版本。

1赞 Daniel Batalla 1/4/2022 #14

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

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

我发现这些步骤最有用。

要检查状态,请运行 。然后,你就可以很好地了解要删除的迁移。rails db:migrate:status

然后,运行以逐个还原更改。执行此操作后,您可以再次检查状态以完全自信。rails db:rollback

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

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

7赞 CHAVDA MEET 5/16/2022 #16

如果您使用的是 Ruby on 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

评论

0赞 gogaz 10/5/2022
对于多次迁移,仅当迁移的顺序与上次应用的顺序相同时,它才有效,而要回滚特定迁移的顺序则无效
0赞 Perumal T 6/21/2022 #17

如果要从上次迁移中恢复,请使用 rake db:rollback 命令。它对我来说工作正常!

评论

3赞 Community 6/23/2022
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
6赞 Akash 12/13/2022 #18

迁移文件如下所示,

 20221213051020_my_migrations

在这种情况下,模型名称应为 。迁移以复数单词结尾,因此以 .MyMigrationmigrations

若要回滚此特定迁移,必须了解迁移名称的第一部分(迁移名称前面的数字)是迁移编号。

回滚此迁移,只需打开终端并编写:

rake db:migrate:down VERSION=migration_number

所以最后,你必须实际输入终端来回滚这个特定的迁移,

在终端上写下以下命令来回滚特定的迁移,上面的命令只是为了解释你

rake db:migrate:down VERSION=20221213051020

请记住,每次迁移都有不同的迁移编号,因此请仔细观察并手动复制粘贴或键入。

5赞 Sachin Singh 1/18/2023 #19

您可以运行迁移命令来回滚迁移,如下所示:down

rake db:migrate:down VERSION=20100905201547
0赞 Bruno Degomme 9/6/2023 #20

如果使用 VSCode,则可以创建以下任务

  {
      "label": "rollback open migration",
      "type": "shell",
      "command": "rails db:migrate:down VERSION=$(basename ${file} .rb | cut -d '_' -f 1)"
  },

运行该任务将回滚在文件编辑器中打开的迁移