Задача Rake db:test:prepare, удаляющая данные из базы данных разработки

Используя простой пример конфигурации Rails sqlite3в моем config/database.ymlдля приложения Rails 3.2.6, Раньше я сбрасывал свою базу данных разработки, повторно заполнял ее и готовил тестовую базу данных, просто выполняя:

$ rake db:reset
$ rake db:test:prepare 

После просмотра этой записи в блогео тестировании приложения Rails с Travis CI] на разных механизмах баз данных, я решил попробовать, поэтому я установил mysql и postgresql с помощью Homebrew(у меня OSX Snow Leopard), настроил их в соответствии с brew информацияинструкции. Я установил соответствующие гемы и настроил базу данных и файлы Travis следующим образом:

Gemfile

# ...
group :development, :test do
  # ...
  gem 'sqlite3', '1.3.6'
end

group :test do
  # ...
  # Test mysql on Travis CI
  gem 'mysql2', '0.3.11'
end

group :test, :production do
  # ...
  # Test postgres on Travis CI and deploy on Heroku
  gem 'pg', '0.13.2'
end

config/database.yml

sqlite: &sqlite
  adapter: sqlite3
  database: db/<%= Rails.env %>.sqlite3

mysql: &mysql
  adapter: mysql2
  username: root
  password:
  database: my_app_<%= Rails.env %>

postgresql: &postgresql
  adapter: postgresql
  username: postgres
  password:
  database: my_app_<%= Rails.env %>
  min_messages: ERROR

defaults: &defaults
  pool: 5
  timeout: 5000
  host: localhost
  <<: *<%= ENV['DB'] || "sqlite" %>

development:
  <<: *defaults

test: &test
  <<: *defaults

production:
  <<: *defaults

cucumber:
  <<: *test

.travis.yml

language: ruby
rvm:
  - 1.9.2
  - 1.9.3
env:
  - DB=sqlite
  - DB=mysql
  - DB=postgresql
script:
  - RAILS_ENV=test bundle exec rake --trace db:migrate
  - bundle exec rake db:test:prepare
  - bundle exec rspec spec/
before_script:
  - mysql -e 'create database my_app_test'
  - psql -c 'create database my_app_test' -U postgres
bundler_args: --binstubs=./bundler_stubs

Однако теперь, когда я запускаю rake db :reset, я получаю сообщение об ошибке Не удалось удалить db/development.sqlite3до успешного создания базы данных разработки. Итак, кажется, что теперь делается несколько вызовов для удаления одной и той же базы данных (?). Результат трассировки выглядит следующим образом:

$ rake db:reset --trace
** Invoke db:reset (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:reset
** Invoke db:drop (first_time)
** Invoke db:load_config (first_time)
** Invoke rails_env (first_time)
** Execute rails_env
** Execute db:load_config
** Execute db:drop
Couldn't drop db/development.sqlite3 : #
** Invoke db:setup (first_time)
** Invoke db:schema:load_if_ruby (first_time)
** Invoke db:create (first_time)
** Invoke db:load_config 
** Execute db:create
db/development.sqlite3 already exists
# ...

Это странно, но, по крайней мере, база данных разработки создается и заполняется. Настоящая проблема возникает, когда я запускаю rake db:test:prepare: хотя сообщений об ошибках нет, а тестовая база данных не создается, данные в базе данных разработки удаляются (схема все еще в такт, однако).Я попытался напрямую указать среду Rails для команды и получил:

$ rake db:test:prepare RAILS_ENV=test
You have 7 pending migrations:
20120503193649 CreateUsers
# ...
Run `rake db:migrate` to update your database then try again.

После запуска rake db:migrate RAILS_ENV=testя смог снова запустить тесты rspec. Итак, мои команды rake для получения тех же результатов теперь изменились на:

$ rake db:reset # (with an error)
$ rake db:migrate RAILS_ENV=test

Если я изменю свойфайл config/database.ymlобратно на простую конфигурацию только sqlite3,db:resetиdb:test:prepareработают так, как я ожидаю.

Значит ли это, что мои настройки mysql и/или postgres вызывают повторение задач rake и/или они искажают настройки среды Rails? Где я должен проверить, действительно ли моя среда настроена для правильной работы с этими тремя механизмами баз данных?

Изменить

Глядя на примечания к выпуску для Rails 3.2.8.rc2, я обнаружил изменение в ActiveRecord, потенциально связанное с этим вопросом:

  • Не устанавливать От RAILS_ENVдо developmentпри использовании db:test:prepareи связанных задач rake. Это вызывало усечение данных базы данных разработки при использовании RSpec. В RC2 снова было исправлено при использовании config.active_record.schema_format = :sql

config/application.rbимеет следующее объяснение:

# Use SQL instead of Active Record's schema dumper when creating the database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql

Моя схема не имеет ограничений или типов столбцов, специфичных для базы данных. , поэтому я не раскомментировал эту строку, однако, учитывая содержание примечания к выпуску, я сделал ставку на то, что RAILS_ENVпо умолчанию developmentможет быть ответственным за удаленные данные в среде разработки .Итак, я попробовал кое-что и получил ожидаемые результаты, делая то, что делал раньше (после обновления Rails до 3.2.8.rc2):

$ rake db:reset # (with an error)
$ rake db:test:prepare RAILS_ENV=test # (with no "pending migrations" issue)

Это немного лучше, но все же кажется мне неправильным, поскольку ошибка с rake db:reset, и мне не имеет смысла устанавливать RAILS_ENV=testпри запуске команды rake, специально предназначенной для тестовой базы данных.

Обновление

Казалось бы, обновление до Rails 3.2.9 решает эту проблему благодаря следующему исправлению:

  • Исправлена ​​ошибка, из-за которой rake db:test:prepareпытался загрузить структуру. sql в базу данных разработки. Исправления #8032.

Grace Liu + Rafael Mendonça França

Теперь я могу снова сбросить мою базу данных разработки, повторно заполнить ее и подготовить тестовую базу данных, просто выполнив:

$ rake db:reset
$ rake db:test:prepare 

12
задан Paul Fioravanti 14 November 2012 в 07:06
поделиться