2016-03-21 2 views
2

У меня есть пользовательская задача 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 `<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.

Поэтому я думаю, что эти два вопроса связаны.

+0

Вы должны опустить 'дб: migrate' задачу, поскольку схема уже загружена. Также добавьте свою текущую версию Rails, 'db: test: prepare' теперь устарела. –

+0

Рельсы версии 3.2.9. Когда я удаляю задачу 'db: migrate', возникает одна и та же ошибка – 23tux

ответ

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 
0

Похоже, что вы запускаете свою задачу рейка в среде разработки, но db:test:prepare работает в тесте по умолчанию. Попробуйте использовать:

RAILS_ENV=test rake db:setup_seed 
Смежные вопросы