it-swarm.com.de

Unterschied zwischen Rake db: migrate db: reset und db: schema: load

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.

584
Gaurav Agarwal
  • db: migrate führt (einzelne) Migrationen aus, die noch nicht ausgeführt wurden.
  • db: create erstellt die Datenbank
  • db: drop löscht die Datenbank
  • db: schema: load erstellt Tabellen und Spalten in der (vorhandenen) Datenbank nach schema.rb

  • db: setup macht db: create, db: schema: load, db: seed

  • db: reset bewirkt db: drop, db: setup

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: create erstellt die Datenbank für die aktuelle Umgebung
  • db: create: all erstellt die Datenbanken für alle Umgebungen
  • db: drop löscht die Datenbank für die aktuelle Umgebung
  • db: drop: all löscht die Datenbanken für alle Envs
  • db: migrate führt Migrationen für die aktuelle Umgebung aus, die noch nicht ausgeführt wurden
  • db: migrate: up führt eine bestimmte Migration durch
  • db: migrate: down setzt eine bestimmte Migration zurück
  • db: migrate: status zeigt den aktuellen Migrationsstatus an
  • db: rollback setzt die letzte Migration zurück
  • db: forward stellt die aktuelle Schema-Version auf die nächste um
  • db: seed Führt (nur) die Datei db/seed.rb aus
  • db: schema: load lädt das Schema in die Datenbank der aktuellen Umgebung
  • 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

  • db: reset führt db: drop db: setup aus
  • db: migrate: redo führt je nach angegebener Migration (db: migrate: down db: migrate: up) oder (db: rollback db: migrate) aus
  • db: migrate: reset führt db: drop aus db: create db: migrate

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)

1239
moritz

TLDR

Verwenden

  • rake db:migrate Wenn Sie Änderungen am Schema vornehmen möchten
  • rake db:reset Wenn Sie die Datenbank löschen möchten, laden Sie das Schema erneut aus schema.rb und setzen Sie die Datenbank neu ein
  • rake db:schema:load Wenn Sie die Datenbank auf das in schema.rb angegebene Schema zurücksetzen möchten (Dadurch werden alle Daten gelöscht)

Erklärungen

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

Relevanter Teil der Befehle aus databases.rake


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
21
sudo bangbang

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.

2
Simon Bagreev

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.

0