错误 迁移未完成;运行 'rake db:migrate RAILS_ENV = development' 以解决此问题。

3

我试图回滚最后一次迁移:

rake db:rollback

IT向我展示了以下内容:

==  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) ===================================

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

1
如果存在,它就假定应该运行。 - apneadiving
如果我在删除此迁移文件后第二次运行rake db:rollback命令,它会回滚最后一个存在的迁移文件,对吗? - medBouzid
现在它运行得很好,谢谢。我对另一个迁移运行了回滚,该迁移创建了我的“pictures”表,但这次没有显示需要运行rake db:migrate RAILS_ENV=development的错误。我不知道为什么这个错误只针对创建列和索引(而不是表)。 - medBouzid
@apneadiving 我过去也经常回滚,但从未删除任何迁移文件,这会很危险吗? - medBouzid
4个回答

10
如果你回滚了迁移操作,数据库模式将被还原到上一个迁移状态。然而,如果你让这个迁移文件一直放在迁移文件夹里面,Rails会认为这个迁移应该被执行,只有在最近的模式迁移后才能运行。
如果你想回滚模式,应该舍弃这个迁移文件。删除该文件,Rails 就不再抱怨了。

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中的内容不匹配,则会出现“Migrations are pending”异常。如果您设置了新系统或进行了干净的操作系统安装,然后将数据库从备份文件恢复,同时运行“rake db:migrate”,则有时会发生这种情况-版本字符串将不同步。解决问题的方法是简单地在schema_migrations表中插入一个新行,并使用db / schema.rb中包含的值-但仅在您确定实际数据库与schema.rb中的模式定义匹配时才执行此操作:
insert into schema_migrations (version) values ('20140284052547');

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


rake db:rollback

如果你想在迁移文件中进行更改,请使用:

rake db:migrate:redo STEP=1

如果你想删除表,可以使用它

rake db:migrate:down VERSION=your_migration_version

0
尝试通过以下命令回滚最近的两个迁移: rake db:rollback STEP=2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接