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

时间:2016-03-21 07:35:45

标签: mysql ruby-on-rails ruby rake rake-task

我有一个自定义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 `<top (required)>'
# /usr/src/app/Rakefile:16:in `block (2 levels) in <top (required)>'
# Tasks: TOP => db:seed

我注意到两件奇怪的事情:

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

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

2 个答案:

答案 0 :(得分:0)

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

RAILS_ENV=test rake db:setup_seed

答案 1 :(得分:0)

我自己找到了解决方案。问题是,任务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