我有一个迁移文件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:rollback

or

rake db:rollback STEP=1

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

rake db:rollback STEP=n

其中n是迁移到回滚的次数,从最近一次迁移开始计算。

如果你想要回滚到一个特定的迁移,那么你应该在下面传递迁移的版本:

rake db:migrate:down VERSION=xxxxx

其中XXXXX是迁移的版本号。

Use:

rake db:migrate:down VERSION=your_migrations's_version_number_here

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

如何找到版本:

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

例如:

文件名称:20140208031131_create_roles.rb

则版本号为20140208031131。

如果是可逆迁移,并且是最后一次已执行的迁移,则执行rake db:rollback。你可以一直使用这个版本。

例如,如果迁移文件为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:rollback
rake db:migrate

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

bundle exec rake db:migrate

我们可以使用

bundle exec rake db:rollback

要从头再来,我们可以用

bundle exec rake db:migrate VERSION=0

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

嗯,在rails中这很简单

rake db:migrate:status

or

rails db:migrate:status

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

rake db:migrate VERSION=2013424230423

确保VERSION全部为大写字母。

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

回滚上次迁移:

# 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

要回滚所有的迁移到一个特定的版本(例如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

参考:只迁移或恢复某些迁移

此外:

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

我在一个较大的Ruby on Rails应用程序中工作,其中有超过1000个迁移文件。而且,我们需要一个月的时间来发布一个中等规模的功能。我正在开发一个功能,一个月前我已经部署了一个迁移,然后在审查过程中,迁移的结构和文件名发生了变化,现在我尝试部署我的新代码,构建失败了,说:

ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR: column "my_new_field" of relation "accounts"已经存在

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

我把文件转移到服务器上了 我打开了rails控制台 我在IRB会话中需要该文件 然后AddNewMyNewFieldToAccounts.new.down

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

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

Rails db:rollback:primary,其中primary是config/databases中数据库的名称。Yml文件,回滚上次迁移。与往常一样,您可以在这里使用STEPS属性。 rails db:migrate:down:primary VERSION=your_migration_timestamp,只恢复提供的迁移版本。这里primary也是数据库的名称。

我发现这些步骤最有用。

执行rails db:migrate:status命令查看状态。然后,您将对想要删除的迁移有一个很好的了解。

然后执行rails db:rollback命令将修改的内容逐一恢复。这样做之后,您可以再次检查状态,以充分自信。

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

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

如果你使用的是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

如果您想从上次迁移中恢复,请使用rake db:rollback命令。它对我很有效!

迁移文件是这样的,

 20221213051020_my_migrations

在本例中,模型名应该是MyMigration。migration以一个复数词结尾,所以它以migrations结尾。

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

要回滚这次迁移,只需打开终端并写入,

rake db:migrate:down VERSION=migration_number

最后,你必须在终端中输入回滚这个特定的迁移,

在终端上写下面的命令回滚一个特定的迁移,上面的命令只是给你解释

rake db:migrate:down VERSION=20221213051020

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

您可以使用down migration命令回退迁移,如下所示:

rake db:migrate:down VERSION=20100905201547