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=test
konnte 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
zudevelopment
bei der Verwendungdb: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 mitconfig.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:reset
und 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Entwicklung-Datenbank wird gelöscht, da ActiveRecord::Base.Konfigurationen hat die test-Datenbank "Entwicklung.sqlite3". Wenn der rake-task wird ausgeführt, die yaml-Konfiguration ist eval ' ed in das ActiveRecord::Base.Konfigurationen hash-und zu dieser Zeit Schienen.env festgelegt ist, die Entwicklung.
Wenn RAILS_ENV=Entwicklung, den Datenbank-Wert für test auf
oder für einen anderen adapter:
Können Sie reproduzieren diese mit einem einfachen sqlite-Konfiguration nur kaufen, ändern Sie die test-block innerhalb der Datenbank.yml die folgenden:
Wenn Sie untersuchen die volle ActiveRecord::Base.Konfigurationen hash-du wirst sehen, der test wird festgelegt, um die Entwicklung db, wenn keine RAILS_ENV angegeben ist. Und wenn Sie waren, um anzugeben, 'Produktion' oder 'Inszenierung', es würde eingestellt werden. Von der Konsole aus:
verglichen mit:
Update
Das Problem, das Sie zu sehen sind mit der db:reset auch, weil deine yaml-Datei interpretiert wird, einmal und dann die config eingestellt ist.
db:reset aufrufen, db:drop und db:setup für das jeweilige Umfeld. Allerdings, wenn die Umwelt ist die Entwicklung, tut es auch jene Aufgaben, für die Testumgebung. So gelingt es, im fallen für die Entwicklungsumgebung und dann, wenn es ausführt, die für das testen der Datenbank-Schlüssel für die Konfiguration ist identisch mit der Entwicklung Abschnitt, damit es nicht lassen können, etwas, das nicht mehr existiert. Hier ist, was die ActiveRecord::Base.Konfigurationen hash aussieht, wenn Schienen.env == 'Entwicklung'
Einmal in das hash, ist es nicht gehen Sie zurück und Lesen der Datenbank.yml-Datei. Das hash ist das, was erzeugt wird angesichts dieser Datenbank.yml
InformationsquelleAutor der Antwort Lukas Eklund
Gleiche problem, d.h. Entwicklung Datenbank zerstört, nachdem ein "rake".
Meinen Weg "rake RAILS_ENV=test".
Mit ruby 1.9.3p194 Schienen 3.2.7 sqlite3.
InformationsquelleAutor der Antwort Dittmar