即使没有挂起的迁移,Rails 4也会抛出挂起迁移错误



我最近将我的应用程序从Rails 3.2.15升级到Rails 4.0.4, rake测试失败抛出:

You have 161 pending migrations:
  20111126090934 DeviseCreateUsers
  20111126195631 AddUsernameToUsers
  20111128012039 CreateLocations
  20111129051416 AddConfirmableToDevise
...
Run `rake db:migrate` to update your database then try again.

我确信,我没有任何挂起的迁移,schema_migrations表是最新的,包含了所有的迁移版本号。另外,

[2] pry(main)> ActiveRecord::Migration.check_pending!
  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
=> nil
[3] pry(main)> 

因为,这是开发环境,我也试图重置db:

$> rake db:migrate:reset

我正在将我的应用程序从Rails 3.2.15移动到Rails 4.0.4。我不明白发生了什么事。

$> rake db:migrate:status
Status   Migration ID    Migration Name
--------------------------------------------------
   up     20111126090934  ********** NO FILE **********
   up     20111126195631  ********** NO FILE **********
   up     20111128012039  ********** NO FILE **********
   up     20111129051416  ********** NO FILE **********
...

这有点奇怪和令人沮丧。我在db/migrate目录中有子文件夹,尽管较旧并且已经迁移,但由于某种原因,通过ActiveRecord::Migrator#pending_migrations列出了这些子文件夹,因此出现了错误。移除子文件夹修复了这个问题。

想知道这在Rails 3中是如何工作的,找不到任何关于这方面的文档。

这个错误最有可能的原因是mysqldump不在您的PATH中。Rails 4需要它来创建测试数据库,如果找不到它,就会给出令人困惑的迁移错误。

OSX上MySQL的默认安装不包括MySQL或mysqldump在你的PATH,你需要修改你的~/。配置文件并添加如下内容:

export PATH=$PATH:/usr/local/mysql/bin

给赛义德的回答加上:

除了删除db/migrate/中的子文件夹,您还可以将它们重命名为以'.'开头。这对我的activerecord 3.2工作。

示例:rename db/migrate/archive/ to db/migrate/.archive/

当您尝试运行rake test时,您需要在test环境上运行迁移。

rake db:migrate RAILS_ENV=test

最新更新