Используя простой пример конфигурации Rails sqlite3 в моем config/database.yml для приложения Rails 3.2.6, я использовал reset мою базу данных разработки, повторно запустите ее и подготовьте мою тестовую базу данных, просто выполнив:
$ rake db:reset
$ rake db:test:prepare
После просмотра этой записи в блоге о тестировании приложения Rails с Travis CI в разных системах баз данных, Я думал, что попробую, поэтому я установил mysql и postgresql, используя Homebrew (я нахожусь на OSX Snow Leopard), настроил их в соответствии с brew info
. Я установил соответствующие драгоценные камни и настроил файлы базы данных и 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
конфигурации /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
, я получаю сообщение об ошибке Couldn't drop 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 : #<Errno::ENOENT: No such file or directory - my_app/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 db:reset # (with an error)
$ rake db:migrate RAILS_ENV=test
Если я изменю свой файл config/database.yml обратно на просто конфигурацию sqlite3, db:reset
и db:test:prepare
работают так, как я ожидаю.
Итак, означает ли это, что мои настройки mysql и/или postgres вызывают повторные задачи рейка и/или они возились с настройками среды Rails? Где я должен искать подтверждение того, действительно ли моя среда настроена для правильной работы с этими 3 двигателями баз данных?
Изменить
Глядя на примечания к выпуску для Rails 3.2.8.rc2, я обнаружил, что изменение ActiveRecord
возможно связано с этим вопросом:
- Не устанавливайте
RAILS_ENV
вdevelopment
при использованииdb:test:prepare
и связанных с ним задач. Это вызывало усечение данных базы данных разработки при использовании RSpec. В RC2 снова было исправлено использованиеconfig.active_record.schema_format = :sql
config/application.rb имеет следующее объяснение:
# Use SQL instead of Active Record 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, специально разработанной для тестовая база данных.
Update
Казалось бы, обновление до Rails 3.2.9 решает эту проблему из-за следующего исправления:
- Исправить ошибку, где
rake db:test:prepare
пытается загрузить struct.sql в базу данных разработки. Исправления # 8032.
Грейс Лю + Рафаэль Мендонса Франса
Теперь я могу снова создать reset мою базу данных разработки, повторно засеять ее и подготовить тестовую базу данных, выполнив:
$ rake db:reset
$ rake db:test:prepare