12
私の config/database.ymlをRails 3.2.6アプリケーション用に使用していましたが、開発データベースをリセットして再シードし、私のテストデータベースは、単純に実行することにより:

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の指示に従ってそれらを設定してください。私は、関連する宝石をインストールし、次のようにデータベースとトラヴィス・ファイルが設定さ:

.travis.yml

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と関連すくいタスクを使用している場合

  • developmentRAILS_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 
+0

何を与えて生成され、あなたは答えを見つけることができましたか?私たちも同様のことを経験しています。 – farid

答えて

関連する問題