Rake db:test:開発データベース内のデータを削除するタスクを準備する
$ rake db:reset
$ rake db:test:prepare
を別のデータベースエンジンでTravis CIでRailsアプリケーションをテストについてthis blog entryを見た後、私はそれを試してみると思ったので、私はHomebrewを使用してMySQLとPostgreSQLをインストール(I OSX Snow Leopardの場合)、brew info
の指示に従ってそれらを設定してください。私は、関連する宝石をインストールし、次のようにデータベースとトラヴィス・ファイルが設定さ:
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
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のテストを実行することができます。私は戻って、簡単なsqlite3の構成だけに私ののconfig/database.ymlをファイルを変更した場合は、
$ rake db:reset # (with an error)
$ rake db:migrate RAILS_ENV=test
db:reset
とを:だから、私の熊手は、同じ結果が今に変更されている取得するコマンドdb:test:prepare
私は期待どおりに動作します。
これは、私のmysqlおよび/またはpostgresの設定によって、レーキタスクが繰り返されること、またはそれらがRails環境設定を乱していることを意味しますか?自分の環境が実際にこれらの3つのデータベースエンジンで正しく動作するように設定されているかどうか確認するにはどうすればよいですか?db:test:prepare
と関連すくいタスクを使用している場合
development
にRAILS_ENV
を設定しないでください:編集release notes for Rails 3.2.8.rc2を見てみると
は、私は潜在的にこの質問に関連
ActiveRecord
への変更が見つかりました。 RSpecを使用している場合、開発データベースのデータが切り捨てられていました。config.active_record.schema_format = :sql
のconfig/application.rbを使用した場合RC2で再び固定した以下の説明があります。
# 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
私のスキーマは、制約またはデータベース固有の列の型を持っていないので、私はdidnのしかし、リリースノートの内容を考えれば、RAILS_ENV
デフォルトのdevelopment
が開発環境の削除されたデータの原因となる可能性があります。だから、私はいくつかのことを試してみたし、(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
のエラーはまだありますが、テストデータベース用に特別に調整されたrakeコマンドを実行する場合はRAILS_ENV=test
に設定する必要はありません。
更新
3.2.9をレールにアップグレードするため、以下の修正にこの問題を解決することを思わ:rake db:test:prepare
が開発データベースにstructure.sqlをロードしようと
- 不具合を修正しました。 #8032を修正しました。
グレース劉+ラファエルMendonçaフランサ
私は今、再び私の開発データベース、再シードそれをリセットし、実行することにより、単に私のテストデータベースを準備することができます
$ rake db:reset
$ rake db:test:prepare
何を与えて生成され、あなたは答えを見つけることができましたか?私たちも同様のことを経験しています。 – farid