有没有办法解决Rails删除的迁移?

Ale*_*tko 6 migration ruby-on-rails rails-migrations ruby-on-rails-3 ruby-on-rails-4

我碰巧删除了迁移,我不想还原这些已删除的迁移.

这是rake db:migrate:status产生:

 Status   Migration ID    Migration Name
------------------------------------------------------

   up     0               ********** NO FILE *********
   up     20150209023430  Create users 
   up     20150320184628  ********** NO FILE **********
   up     20150322004817  Add roles to users
   up     20150403190042  ********** NO FILE **********
Run Code Online (Sandbox Code Playgroud)

rake db:migraterake db:rollback由于缺少文件,命令将无法工作.

我没有意图丢失我的数据,所以我不想使用rake db:droprake db:reset.

我能做些什么来执行迁移回滚以及如何摆脱丢失的文件?

小智 7

亚历山大,你可以摆脱那些不存在的迁移.当你这样做时rake db:migrate:status,它将显示在问题中.

所以你可以schema_migrations使用纯SQL查询从表中手动删除这些版本.

delete from schema_migrations where version = <version_number> 通过执行上面的查询,它将被解决.

  • @AlexanderShmatko只是为了澄清,一个版本的数组可以进入`where`子句.像这样:ActiveRecord :: SchemaMigration.where(version:[20170506145701,20170506145702,20170506145703]).delete_all (5认同)
  • 或者`ActiveRecord :: SchemaMigration.where().delete_all` (4认同)

Rut*_*ins 5

如果您可以找到迁移的时间戳 - 文件名的数字部分,那么您可以执行以下操作:

rake db:migrate:down VERSION=20100905201547
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法找到时间戳 rake db:migrate:status

编辑- 当迁移文件被不可恢复地删除时

您可以通过创建一个空的迁移文件,迁移,然后回滚两次来解决这个问题。然后,确保在再次迁移之前删除空的迁移文件。

$ bundle exec rails g migration fix_rollback_error
$ bundle exec rails db:migrate
$ bundle exec rails db:rollback STEP=2
$ rm db/migrate/20200217040302_fix_rollback_error.rb
$ bundle exec rails db:migrate
Run Code Online (Sandbox Code Playgroud)