3

我试图回滚上次迁移:

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

4 回答 4

10

如果您回滚迁移,则数据库架构将恢复到之前的迁移。

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

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

于 2013-12-01T10:33:10.513 回答
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');
于 2014-06-19T18:51:30.893 回答
0

试试这个命令回滚,而不是

rake db:rollback

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

rake db:migrate:redo STEP=1

如果要删除表,请使用它

rake db:migrate:down VERSION=your_migration_version
于 2013-12-01T10:24:30.100 回答
0

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

于 2013-10-31T19:04:02.233 回答