错误 迁移挂起;运行'rake db:migrate RAILS_ENV=development'以解决此问题



我试图回滚上次迁移:

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=开发时,它会重新创建我在上面回滚的内容:

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

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

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

但是,如果您将迁移保留在迁移文件夹中,Rails 会假定迁移应该运行,并且在迁移到最新模式之前不会起作用。

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

请记住

,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 中的架构定义匹配时才执行此操作:

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

尝试通过以下方式回滚 2 次最后的迁移:耙子 db:回滚步骤=2

尝试此命令回滚,而不是

rake db:rollback

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

rake db:migrate:redo STEP=1

如果要删除表,请使用它

rake db:migrate:down VERSION=your_migration_version

最新更新