我最近将我的应用程序从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