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

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


当前回答

此外:

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

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

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

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

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

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

其他回答

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

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

嗯,在rails中这很简单

rake db:migrate:status

or

rails db:migrate:status

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

rake db:migrate VERSION=2013424230423

确保VERSION全部为大写字母。

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

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

rake db:migrate:down VERSION=20100905201547

我发现这些步骤最有用。

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

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

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

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

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

rake db:migrate:redo

也就是:

rake db:rollback
rake db:migrate