有没有办法解决 Rails 已删除的迁移?
Is there a way to resolve Rails deleted migrations?
我碰巧删除了迁移,我不想还原这些已删除的迁移。
这是 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 **********
由于缺少文件,rake db:migrate
和 rake db:rollback
命令将无法运行。
我不想丢失我的数据,所以我不想使用 rake db:drop
或 rake db:reset
。
我该怎么做才能执行 migrate 和 rollback 以及如何删除丢失的文件?
Alexander,你可以摆脱那些不存在的迁移。
当您执行 rake db:migrate:status
时,它将显示为问题中的内容。
因此您可以使用纯 sql 查询从 schema_migrations
table 中手动删除这些版本。
delete from schema_migrations where version = <version_number>
通过执行上面的查询,它将得到解决。
如果你能找到迁移的时间戳 - 文件名的数字部分,那么你可以这样做:
rake db:migrate:down VERSION=20100905201547
您可以使用 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
我碰巧删除了迁移,我不想还原这些已删除的迁移。
这是 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 **********
由于缺少文件,rake db:migrate
和 rake db:rollback
命令将无法运行。
我不想丢失我的数据,所以我不想使用 rake db:drop
或 rake db:reset
。
我该怎么做才能执行 migrate 和 rollback 以及如何删除丢失的文件?
Alexander,你可以摆脱那些不存在的迁移。
当您执行 rake db:migrate:status
时,它将显示为问题中的内容。
因此您可以使用纯 sql 查询从 schema_migrations
table 中手动删除这些版本。
delete from schema_migrations where version = <version_number>
通过执行上面的查询,它将得到解决。
如果你能找到迁移的时间戳 - 文件名的数字部分,那么你可以这样做:
rake db:migrate:down VERSION=20100905201547
您可以使用 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