错误迁移正在等待;运行'rake db:migrate RAILS_ENV = development'来解决此问题

时间:2013-09-30 23:47:29

标签: ruby-on-rails

我尝试回滚上次迁移:

rake db:rollback
它告诉我以下内容:

==  AddUserIdToPictures: reverting ============================================
-- remove_index(:pictures, {:column=>[:user_id, :visible]})
-> 0.1201s
-- remove_column(:pictures, :user_id, :integer)
-> 0.0127s
==  AddUserIdToPictures: reverted (0.1567s) ===================================

然后,如果我尝试访问某个页面,我会收到错误:

Migrations are pending; run 'rake db:migrate RAILS_ENV=development' to resolve this issue

但当我做错误时说:rake db:migrate RAILS_ENV = development,它重新创建我上面的回滚:

==  AddUserIdToPictures: migrating ============================================
-- add_column(:pictures, :user_id, :integer)
-> 0.0300s
-- add_index(:pictures, [:user_id, :visible])
-> 0.1007s
==  AddUserIdToPictures: migrated (0.1310s) ===================================

这里有什么问题?我应该在运行命令之前删除迁移文件吗?

4 个答案:

答案 0 :(得分:8)

如果回滚迁移,则数据库架构将还原为先前的迁移。

但是,如果您将迁移保留在迁移文件夹中,则Rails会假定应该运行迁移,并且在迁移到最新的架构之前无法运行。

如果要回滚架构,则应放弃迁移。删除文件,Rails不会抱怨。

答案 1 :(得分:1)

请记住,Rails会创建一个schema_migrations表,该表由一个名为“version”的列组成,其中包含最新的架构迁移ID字符串。 id字符串对应于db / schema.rb中的id字符串:

ActiveRecord::Schema.define(version: 20140284052547) do

  # Your model definitions

end

如果SchemaMigration#version中的版本字符串与db / schema.rb中的版本字符串不匹配,您将获得“正在等待迁移”异常。如果您设置新系统或执行干净的操作系统安装,然后从备份文件还原数据库,以及运行“rake db:migrate”,则有时会发生这种情况 - 版本字符串将不同步。解决问题的方法是简单地在schema_migrations表中插入一个新行,其值包含在db / schema.rb中 - 但是如果您确定实际数据库与schema.rb中的模式定义匹配,则只执行此操作: / p>

insert into schema_migrations (version) values ('20140284052547');

答案 2 :(得分:0)

尝试通过以下方式回滚最近2次迁移: rake db:rollback STEP = 2

答案 3 :(得分:0)

尝试使用此命令进行回滚,而不是

rake db:rollback

如果您想要更改迁移文件,请使用

rake db:migrate:redo STEP=1

如果要删除表

,请使用它
rake db:migrate:down VERSION=your_migration_version