Unterschied zwischen Rake-Datenbank: Migrieren von Datenbank: Zurücksetzen und Datenbank: Schema: Laden


619

Der Unterschied zwischen rake db:migrateund rake db:resetist in meinem Kopf ziemlich klar. Was ich nicht verstehe, ist, wie rake db:schema:loadunterschiedlich die beiden früheren sind.

Nur um sicherzugehen, dass ich auf derselben Seite bin:

  • rake db:migrate - Führt die Migrationen aus, die noch nicht ausgeführt wurden.
  • rake db:reset- Löscht die Datenbank (vermutlich ein rake db:drop+ rake db:create+ rake db:migrate) und führt die Migration auf einer neuen Datenbank aus.

Bitte helfen Sie zu klären, ob mein Verständnis falsch ist.


10
Hilft das rake --tasks?
zx1986

Sie sollten diesen Blog überprüfen. jacopretorius.net/2014/02/…
Bishisht Bhatta

Ihr Verständnis von rake db:migrateist richtig, aber Ihr Verständnis von rake db:resetist falsch. Siehe die oberste Antwort von moritz.
Magne

1
BTW, wie Rails 5 können diese Befehle aufgerufen werden rails db:migrate, rails db:reset, rails db:schema:load. Siehe stackoverflow.com/questions/38403533/…
Purplejacket

Antworten:


1303
  • 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 macht db: drop, db: setup
  • db: migrate: reset macht db: drop, db: create, db: migrate

In der Regel verwenden Sie db: migrate, nachdem Sie Änderungen am Schema über neue Migrationsdateien vorgenommen haben (dies ist nur dann 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 Schienen 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 envs
  • 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 aus
  • db: migrate: down rollt eine bestimmte Migration zurück
  • db: migrate: status zeigt den aktuellen Migrationsstatus an
  • db: Rollback setzt die letzte Migration zurück
  • db: forward rückt die aktuelle Schemaversion zur nächsten vor
  • db: seed (nur) führt 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 läuft db: drop db: setup
  • db: migrate: redo wird je nach angegebener Migration ausgeführt (db: migrate: down db: migrate: up) oder (db: rollback db: migrate)
  • db: migrate: reset wird ausgeführt db: drop 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 / database.rake (für Rails 4.0.x)


16
Hier ist die Datei mit Antworten :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion

3
@cutation: db: setup führt db: migrate sicherlich nicht aus, da es viel zu spröde wäre, alle Migrationen nur für ein db-Setup auszuführen (dafür ist schema.rb gedacht).
Moritz

2
Ich führe db: reset aus und es sät meine db. Warum könnte es sein?
Alejandro Riedel

db: setup läuft db:createbei Bedarf auch. Zumindest ab Schienen 4.0.2.
Dan

Rails 4 wird rake db:migratebeim Aufrufen ausgeführt, rake db:setupwenn ausstehende Migrationen vorliegen, ausstehende Migrationen jedoch nicht ausgeführt werden.
Pooyan Khosravi

24

TLDR

Verwenden

  • rake db:migrate Wenn Sie Änderungen am Schema vornehmen möchten
  • rake db:resetWenn Sie die Datenbank schema.rblöschen möchten , laden Sie das Schema neu und setzen Sie die Datenbank erneut ein
  • rake db:schema:loadWenn Sie die Datenbank auf das Schema zurücksetzen möchten, wie in schema.rb(Dies löscht alle Daten)

Erklärungen

rake db:schema:loadrichtet das Schema wie in der schema.rbDatei angegeben ein. Dies ist nützlich für eine Neuinstallation der App, da dies nicht so lange dauert wiedb:migrate

Wichtiger Hinweis, db:schema:loadwerden gelöscht werden Daten auf dem Server.

rake db:migratenimmt Änderungen am vorhandenen Schema vor. Es ist wie das Erstellen von Versionen des Schemas. db:migratesucht db/migrate/nach Ruby-Dateien und führt die Migrationen aus, die noch nicht ausgeführt wurden, beginnend mit der ältesten. Rails erkennt anhand des Zeitstempels am Anfang des Migrationsdateinamens, welche Datei die älteste ist. db:migratehat den Vorteil, dass Daten auch in die Datenbank gestellt werden können. Dies ist eigentlich keine gute Praxis. Es ist besser, rake db:seedDaten hinzuzufügen.

rake db:migrateBietet Aufgaben nach oben , unten usw., die Befehle wie aktivieren rake db:rollbackund zum nützlichsten Befehl machen.

rake db:resettut a db:dropund db:setup
Es löscht die Datenbank, erstellt sie erneut, lädt das Schema und initialisiert mit den Startdaten

Relevanter Teil der Befehle aus database.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

Wenn Sie also Ihr Produktionsschema mit db: schema: load (erstellt aus einer Reihe früherer Migrationen) erstellen, wissen Sie, welche Migrationen (diejenigen, die an der Erstellung der ersten schema.rb beteiligt waren) in Zukunft nicht mehr ausgeführt werden müssen Aufrufe von db: migrieren?
CanadaIT

2

Soweit ich weiß, wird Ihre Datenbank gelöscht und basierend auf Ihrer db/schema.rbDatei neu erstellt. Aus diesem Grund müssen Sie sicherstellen, dass Ihre schema.rbDatei immer auf dem neuesten Stand und unter Versionskontrolle ist.


0

Sie können sich einfach die Active Record Rake-Aufgaben ansehen, da sie meiner Meinung nach 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 unterschiedlich sind. Hier haben wir eine andere Datei voller Aufgaben.

https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

welches diese Aufgaben hat.

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, insbesondere in die Rake-Dateien und -Aufgaben. Da sie Ihnen bei der Verwendung von Schienen sehr gut helfen, dokumentieren sie den Code nicht immer so gut. Wir könnten alle dort helfen, wenn wir wissen, was es tun soll.


Bitte zitieren Sie relevante Teile des Artikels, falls dieser entfernt wird. Schlagen Sie nicht vor, etwas zu tun, ohne zu erklären, warum.
PhilT

0

AKTUALISIERT für Rails 5:

db:create- Erstellt die Datenbank für die aktuelle RAILS_ENV- Umgebung. Wenn RAILS_ENV nicht angegeben ist, werden standardmäßig die Entwicklungs- und Testdatenbanken verwendet.

db:create:all - Erstellt die Datenbank für alle Umgebungen.

db:drop- Löscht die Datenbank für die aktuelle RAILS_ENV- Umgebung. Wenn RAILS_ENV nicht angegeben ist, werden standardmäßig die Entwicklungs- und Testdatenbanken verwendet.

db:drop:all - Löscht die Datenbank für alle Umgebungen.

db:migrate- Führt Migrationen für die aktuelle Umgebung aus, die noch nicht ausgeführt wurden. Standardmäßig werden Migrationen nur in der Entwicklungsumgebung ausgeführt.

db:migrate:redo- Führt db: migrate: down und db: migrate: up oder db: migrate: rollback und db: migrate: up abhängig von der angegebenen Migration aus.

db:migrate:up - Führt den Start für die angegebene Migrationsversion aus.

db:migrate:down - Führt das Down für die angegebene Migrationsversion aus.

db:migrate:status - Zeigt den aktuellen Migrationsstatus an.

db:migrate:rollback - Setzt die letzte Migration zurück.

db:version - Druckt die aktuelle Schemaversion.

db:forward - Schiebt das Schema auf die nächste Version.

db:seed- Führt die Datei db / seeds.rb aus .

db:schema:loadErstellt die Datenbank aus der Datei schema.rb neu .

db:schema:dumpGibt das Schema der aktuellen Umgebung in db / schema.rb aus .

db:structure:load- erstellt die Datenbank aus der structure.sql Datei.

db:structure:dump- Gibt das Schema der aktuellen Umgebung in db / struct.sql aus . (Sie können eine andere Datei mit angeben SCHEMA=db/my_structure.sql)

db:setupFührt db: create , db: schema: load und db: seed aus .

db:resetLäuft db: drop und db: setup . db:migrate:reset- Läuft db: drop , db: create und db: migrate aus .

db:test:prepare- Suchen Sie nach ausstehenden Migrationen und laden Sie das Testschema. (Wenn Sie Rake ohne Argumente ausführen, wird dies standardmäßig ausgeführt.)

db:test:clone - Erstellen Sie die Testdatenbank aus dem Datenbankschema der aktuellen Umgebung neu.

db:test:clone_structure- Ähnlich wie bei db: test: clone , stellt jedoch sicher, dass Ihre Testdatenbank dieselbe Struktur einschließlich Zeichensätzen und Kollatierungen aufweist wie die Datenbank Ihrer aktuellen Umgebung.

db:environment:set- Legen Sie die aktuelle RAILS_ENV- Umgebung in den ar_internal_metadata fest Tabelle . (Wird im Rahmen der Überprüfung der geschützten Umgebung verwendet.)

db:check_protected_environments- Überprüft, ob in der aktuellen RAILS_ENV- Umgebung eine destruktive Aktion ausgeführt werden kann . Wird intern verwendet, wenn eine destruktive Aktion wie db: drop oder db: schema: load ausgeführt wird .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.