I have a custom rake task, that creates a development DB with data for various situation. The core looks like this:
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
Everything runs fine, until db:seed
is invoked, because it throws an error that tables does not exist. This is my 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
I noticed two strange things here:
articles
(or any table). When I halt at the beginning of my seed file and look into the DB (development), the tables are present, but the test db is emptyRails.env
and it returns development
. However the failure message states that it tries to load the DB app_test.articles
and not app_development.articles
.So I think this two issues are related.
I found the solution myself. The problem was, that the task Rake::Task['db:test:prepare'].invoke
changes the environment to test
, so putting that line to the bottom of the script and everything works:
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