DB的自定义rake任务:找不到表

我有一个自定义rake任务,它创建一个包含各种情况数据的开发DB。 核心看起来像这样:

namespace :db do task setup_seed: :environment do Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke Rake::Task['db:schema:load'].invoke Rake::Task['db:migrate'].invoke Rake::Task['db:test:prepare'].invoke Rake::Task['db:seed'].invoke end end 

一切运行正常,直到db:seed被调用,因为它抛出了表不存在的错误。 这是我的seed.rb

 puts Rails.env # => development puts Article.count # rake aborted! # Mysql2::Error: Table 'app_test.articles' doesn't exist: SHOW FULL FIELDS FROM `articles` # /usr/src/app/db/seeds.rb:2:in `' # /usr/src/app/Rakefile:16:in `block (2 levels) in ' # Tasks: TOP => db:seed 

我注意到这里有两件奇怪的事:

  • 首先,它没有找到表格articles (或任何表格)。 当我在种子文件的开头停止并查看数据库(开发)时,表存在, 但测试数据库为空
  • 我打印了Rails.env并返回development 。 但是,失败消息表明它尝试加载数据库app_test.articles而不是app_development.articles

所以我认为这两个问题是相关的。

看起来您正在开发环境中运行rake任务,但db:test:prepare默认情况下在test中运行。 尝试调用:

 RAILS_ENV=test rake db:setup_seed 

我自己找到了解决方案。 问题是,任务Rake::Task['db:test:prepare'].invoke更改了要test的环境,因此将该行放在脚本的底部,一切正常:

 namespace :db do task setup_seed: :environment do Rake::Task['db:drop'].invoke Rake::Task['db:create'].invoke Rake::Task['db:schema:load'].invoke Rake::Task['db:migrate'].invoke Rake::Task['db:seed'].invoke Rake::Task['db:test:prepare'].invoke # this one should be at the bottom end end