【问题标题】:error Migrations are pending; run 'rake db:migrate RAILS_ENV=development' to resolve this issue错误迁移未决;运行 'rake db:migrate RAILS_ENV=development' 来解决这个问题
【发布时间】:2013-09-30 23:47:29
【问题描述】:

我尝试回滚上次迁移:

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

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

【问题讨论】:

  • 就是这样,如果它存在,它假定它应该运行
  • 如果我在删除这个迁移文件后第二次运行 rake db:rollback 会回滚最后一个存在的迁移文件吗?
  • 它现在可以正常工作了,谢谢,我为另一个创建我的“图片”表的迁移运行回滚,但这次没有显示需要运行 rake db:migrate RAILS_ENV=development 的错误,我不'不知道为什么这个错误是特定于创建列和索引(而不是表)
  • @apneadiving 我过去也做了很多回滚,但从未删除任何迁移文件,这会很危险吗?

标签: ruby-on-rails


【解决方案1】:

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

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

如果您想回滚架构,您应该放弃迁移。删除文件,Rails 不会报错。

【讨论】:

    【解决方案2】:

    请记住,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');
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        rake db:rollback
        

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

        rake db:migrate:redo STEP=1
        

        如果您想删除表格,请使用它

        rake db:migrate:down VERSION=your_migration_version
        

        【讨论】:

          猜你喜欢
          • 2014-02-08
          • 1970-01-01
          • 2014-08-11
          • 2013-12-03
          • 1970-01-01
          • 1970-01-01
          • 2015-04-29
          • 2014-02-14
          • 2016-03-15
          相关资源
          最近更新 更多