Rake db:test:prepare-task löschen von Daten in der Datenbank-Entwicklung

Mit einem einfache Schienen sqlite3-Konfiguration, Beispiel in meinem config/database.yml für eine Rails 3.2.6 app, die ich verwendet, um reset-meine Entwicklung-Datenbank, re-Seeding es, und bereite meine test-Datenbank einfach durch ausführen:

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

Nach einem Blick auf dieser blog-Eintrag zum testen einer Rails-Anwendung mit Travis CI auf verschiedenen Datenbank-engines, dachte ich, ich würde es versuchen, so habe ich installiert, mysql-und postgresql-verwenden Homebrew (ich bin auf OSX Snow Leopard), legen Sie Sie wie pro die brew info Anweisungen. Ich installierte die entsprechenden Edelsteine, und konfigurieren Sie die Datenbank und Travis Dateien wie folgt:

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

Nun, obwohl, wenn ich rake db:reset bekomme ich einen Couldn't drop db/development.sqlite3 Fehlermeldung, bevor Sie die Entwicklung der Datenbank wurde erfolgreich erstellt. So, es scheint, dass es jetzt mehrere Anrufe gemacht, um Tropfen der gleichen Datenbank(?). Die gerenderten Ausgabe sieht so aus:

$ 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
# ...

Dies ist seltsam, aber zumindest die Entwicklung der Datenbank wird angelegt und ausgesät. Das eigentliche Problem kommt, wenn ich laufen rake db:test:prepare: es gibt zwar keine Fehlermeldungen, sowie die test-Datenbank nicht erstellt werden, dass die Daten in der Entwicklung Datenbank wird weggeblasen (schema ist noch in Takt, obwohl). Ich habe versucht, direkt die Angabe der Schienen-Umgebung für den Befehl und bekam:

$ 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.

Nach dem ausführen rake db:migrate RAILS_ENV=testkonnte ich meine rspec-tests wieder. So, mein rake-Befehle, um die gleichen Ergebnisse haben sich nun geändert:

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

Wenn ich meine config/database.yml Datei auf eine einfache sqlite3 Konfiguration nur db:reset und db:test:prepare funktioniert wie ich erwarte.

So, bedeutet das, dass mein mysql und/oder PostgreSQL-Einstellungen verursacht werden rake-tasks zu wiederholen und/oder Sie sind messing mit der Rails-Umgebung Einstellungen? Wo sollte ich suchen, um zu bestätigen, wenn meine Umgebung ist wirklich eingerichtet, um richtig zu arbeiten mit dieser 3-Datenbank-engines?

Bearbeiten

Blick auf die release notes für Rails 3.2.8.rc2ich fand eine Veränderung zu ActiveRecord möglicherweise im Zusammenhang mit dieser Frage:

  • Nicht festlegen RAILS_ENV zu development bei der Verwendung db:test:prepare und damit verbundene Rechen-Aufgaben. Dies führte dazu, dass die Kürzung der Entwicklung Datenbank-Daten bei der Verwendung von RSpec. Im RC2 wurde wieder fixiert, wenn mit config.active_record.schema_format = :sql

config/application.rb hat die folgende Erklärung:

# 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

Meinem schema nicht Einschränkungen oder Datenbank-spezifische Spalten-Typen, so dass ich nicht kommentieren Sie diese Zeile, da jedoch der Inhalt der release-note habe ich gewettet, dass RAILS_ENV säumige development verantwortlich sein könnte für die gelöschten Daten in die Entwicklungsumgebung. So versuchte ich ein paar Dinge, und bekam die erwarteten Ergebnisse durch das, was ich vorher gemacht habe (nach Upgrade von Rails zu 3.2.8.rc2):

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

Dies ist ein bisschen besser, aber immer noch scheint mir falsch zu sein, da ist noch ein Fehler mit rake db:resetund es hat keinen Sinn, mich stellen zu müssen RAILS_ENV=test beim laufen einen rake-Befehl speziell für die test-Datenbank.

Update

Es scheint, dass die Aktualisierung auf Schienen 3.2.9 löst dieses Problem durch die folgende Korrektur:

  • Fix bug, wo rake db:test:prepare versucht, beim laden der Struktur.sql in die Entwicklung der Datenbank. Fixes #8032.

Grace Liu + Rafael Mendonça França

Kann ich jetzt wieder zurücksetzen meine Entwicklung, Datenbank, re-Seeding es, und bereite meine test-Datenbank einfach durch ausführen:

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

InformationsquelleAutor der Frage Paul Fioravanti | 2012-06-22

Schreibe einen Kommentar