Der Unterschied zwischen rake db:migrate
und rake db:reset
ist in meinem Kopf ziemlich klar. Was ich nicht verstehe, ist, wie sich rake db:schema:load
von den beiden ersteren unterscheidet.
Nur um sicherzugehen, dass ich auf der gleichen Seite bin:
rake db:migrate
- Führt die Migrationen aus, die noch nicht ausgeführt wurden.rake db:reset
- Löscht die Datenbank (führt vermutlich einen rake db:drop
+ rake db:create
+ rake db:migrate
aus) und führt die Migration auf eine neue Datenbank durch.Bitte helfen Sie zu klären, ob mein Verständnis falsch ist.
db: schema: load erstellt Tabellen und Spalten in der (vorhandenen) Datenbank nach schema.rb
db: setup macht db: create, db: schema: load, db: seed
Normalerweise verwenden Sie db: migrate, nachdem Sie das Schema über neue Migrationsdateien geändert haben (dies ist nur sinnvoll, wenn sich bereits Daten in der Datenbank befinden). db: schema: load wird verwendet, wenn Sie eine neue Instanz Ihrer App einrichten.
Ich hoffe das hilft.
UPDATE für Rails 3.2.12:
Ich habe gerade die Quelle überprüft und die Abhängigkeiten sind jetzt so:
db: schema: dump gibt das Schema der aktuellen Umgebung aus (und scheint auch die Datenbank zu erstellen)
db: setup führt db: schema: load, db: seed aus
Weitere Informationen finden Sie unter https://github.com/Rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (für Rails 3.2.x) und https://github.com/Rails/rails/blob/v4.0.5/activerecord/lib/active_record/railties/databases.rake (für Rails 4.0.x)
Verwenden
rake db:migrate
Wenn Sie Änderungen am Schema vornehmen möchtenrake db:reset
Wenn Sie die Datenbank löschen möchten, laden Sie das Schema erneut aus schema.rb
und setzen Sie die Datenbank neu einrake db:schema:load
Wenn Sie die Datenbank auf das in schema.rb
angegebene Schema zurücksetzen möchten (Dadurch werden alle Daten gelöscht)rake db:schema:load
richtet das Schema wie in der Datei schema.rb
angegeben ein. Dies ist nützlich für eine Neuinstallation der App, da es nicht so lange dauert wie db:migrate
Wichtiger Hinweis,
db:schema:load
wird delete Daten auf dem Server.
rake db:migrate
nimmt Änderungen am vorhandenen Schema vor. Es ist wie das Erstellen von Versionen des Schemas. db:migrate
sucht in db/migrate/
nach Ruby Dateien und führt die Migrationen aus, die noch nicht ausgeführt wurden. Beginnen Sie mit der ältesten. Rails erkennt anhand des Zeitstempels am Anfang des Migrationsdateinamens, welche Datei die älteste ist. db:migrate
hat den Vorteil, dass Daten auch in die Datenbank aufgenommen werden können. Dies ist eigentlich keine gute Praxis. Es ist besser, rake db:seed
zu verwenden, um Daten hinzuzufügen.
rake db:migrate
bietet Tasks hoch , runter usw., mit denen Befehle wie rake db:rollback
aktiviert und zum nützlichsten Befehl gemacht werden.
rake db:reset
macht einen db:drop
und db:setup
Die Datenbank wird gelöscht, neu erstellt, das Schema geladen und mit den Seed-Daten initialisiert
namespace :schema do
desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
task :dump => [:environment, :load_config] do
require 'active_record/schema_dumper'
filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
File.open(filename, "w:utf-8") do |file|
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
db_namespace['schema:dump'].reenable
end
desc 'Loads a schema.rb file into the database'
task :load => [:environment, :load_config, :check_protected_environments] do
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:Ruby, ENV['SCHEMA'])
end
# desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
task :reset => [ 'db:drop', 'db:setup' ]
namespace :migrate do
# desc 'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
task :redo => [:environment, :load_config] do
if ENV['VERSION']
db_namespace['migrate:down'].invoke
db_namespace['migrate:up'].invoke
else
db_namespace['rollback'].invoke
db_namespace['migrate'].invoke
end
end
Soweit ich weiß, wird Ihre Datenbank gelöscht und basierend auf Ihrer db/schema.rb
-Datei neu erstellt. Aus diesem Grund müssen Sie sicherstellen, dass Ihre schema.rb
-Datei immer auf dem neuesten Stand ist und der Versionskontrolle unterliegt.
Sie können einfach in den Active Record Rake-Tasks nachsehen, da sie meines Erachtens dort wie in dieser Datei leben. https://github.com/Rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb
Was sie tun, ist Ihre Frage richtig?
Das hängt davon ab, woher sie kommen, und dies ist nur ein Beispiel dafür, dass sie je nach Aufgabe variieren. Hier haben wir eine andere Datei voller Aufgaben.
https://github.com/Rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile
welche hat diese aufgaben.
namespace :db do
task create: ["db:mysql:build", "db:postgresql:build"]
task drop: ["db:mysql:drop", "db:postgresql:drop"]
end
Dies beantwortet Ihre Frage möglicherweise nicht, kann Ihnen jedoch einen Einblick in die Vorgehensweise geben und die Quelle untersuchen, insbesondere die Rake-Dateien und -Aufgaben. Da sie Ihnen bei der Verwendung von Rails ziemlich gut helfen, dokumentieren sie den Code nicht immer so gut. Wir könnten alle dort helfen, wenn wir wissen, was es tun soll.