Als ich mit Rails arbeitete, bemerkte ich, dass es viele Dateien und Befehle gab, von denen ich irgendwie wusste, dass sie existieren, aber ich verstand nicht ganz, was sie taten. Eine davon ist die Migrationsdatei.
Wenn ich ein Modell erstelle, weiß ich nicht, warum eine Migrationsdatei erstellt wird, und wenn ich "Rails db: migrate" eingebe, werden diese als Tabellendaten in "schema.rb" angezeigt ... Das war die Anerkennung, aber ich werde tiefer graben und es erklären!
Die Migrationsdatei ist eine Entwurfszeichnung zum Generieren der Datenbank. Durch Ausführen der Migrationsdatei wird außerdem eine Datentabelle generiert, die auf den beschriebenen Inhalten basiert.
Wenn Sie ein Modell erstellen, indem Sie Folgendes in das Terminal eingeben, wird automatisch eine Migrationsdatei generiert.
Grundlegende Syntax
Schienen g Modell Modellname#Hier lautet der Modellname "Buch"
db/migrate/20201114044025_create_books.rb
class CreateBooks < ActiveRecord::Migration[5.2]
def change
create_table :books do |t|
t.timestamps
end
end
end
Im Ausgangszustand, wenn die Migrationsdatei abgeschlossen ist, können Sie sehen, dass standardmäßig nur "t.timestamps" aufgelistet ist.
Dies fügt der Spalte created_at
hinzu, was das Erstellungsdatum und die Erstellungszeit bedeutet, und updated_at
, was das Aktualisierungsdatum und die Aktualisierungszeit bedeutet, zur Spalte.
Lassen Sie uns nun die von uns erstellte Migrationsdatei ausführen! Ich habe das Gefühl, dass es nicht genug Spalten gibt, die ich tatsächlich brauche, aber ich wage es, es so zu lassen, wie es ist!
Die erstellte Migrationsdatei wird durch Eingabe des folgenden Befehls im Terminal gelesen und in der Datenbank angezeigt.
Befehl
rails db:migrate
Dieses Mal habe ich nur eine Migrationsdatei erstellt. Ich denke, Sie können mehrere Modelle gleichzeitig erstellen (oder besser gesagt, es gibt mehr). Wenn Sie in einem solchen Fall überprüfen möchten, wie weit die von Ihnen erstellte Migrationsdatei ausgeführt wird, geben Sie den folgenden Befehl in das Terminal ein.
Befehl
rails db:migrate:status
Anschließend wird der aktuelle Status der Migrationsdatei an das Terminal ausgegeben.
Terminal
Status Migration ID Migration Name
--------------------------------------------------
up 20201114044025 Create books
Die Migrationsdatei, die aktiv ist, wird bereits ausgeführt, sodass sie auch dann nicht gelesen wird, wenn Sie den Befehl
Rails db: migrate
eingeben. Wenn Sie also eine Migrationsdatei bearbeiten, die beim Erstellen einer Spalte mit dem falschen Namen "up" ist, wird sie nicht gelesen und ist bedeutungslos.
Referenz: [Rails] Ausführliche Erklärung der Migrationsdateien!
Was ist, wenn Sie der soeben erstellten Büchertabelle eine neue Spalte hinzufügen möchten? Lassen Sie uns vorerst die Schemadatei überprüfen!
Wenn die Migration ausgeführt wird, wird eine Datei mit dem Namen "schema.rb" im Ordner "db" erstellt. Schauen wir uns sofort den Inhalt an.
db/schema.rb
ActiveRecord::Schema.define(version: 2020_11_14_044025) do
create_table "books", force: :cascade do |t|
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Es scheint, dass die Tabelle erfolgreich erstellt wurde.
Die Beschreibung force :: cascade
ermöglicht das erneute Laden des Schemas, wenn der externe Schlüssel korrekt ist.
Fügen wir nun hier eine Spalte mit dem Namen "Titel" hinzu!
Es gibt zwei Möglichkeiten, einer vorhandenen Tabelle Spalten hinzuzufügen.
Rails db: Rollback
hinzuGeben Sie in diesem Fall den folgenden Befehl in das Terminal ein
Befehl
Schienen g Migration Hinzufügen eines Spaltennamens zum Hinzufügen zum Tabellennamen zum Hinzufügen des Spaltennamens zum Hinzufügen:Schimmel
In diesem Fall sieht es so aus:
Terminal
rails g migration AddTitleToBooks title:string
Anschließend wird die folgende Migrationsdatei erstellt.
Migrationsdatei
class AddTitleToBooks < ActiveRecord::Migration[5.2]
def change
add_column :books, :title, :string
end
end
Führen Sie danach die Migrationsdatei aus und die Spalte "Titel" wird der Tabelle hinzugefügt.
Befehl
rails db:migrate
Rails db: Rollback
hinzuBefehl
rails db:migrate:rollback
Durch Eingabe dieses Befehls im Terminal wird die neueste Version der Migrationsdatei auf den Stand vor "Rails DB: Migration" zurückgesetzt. In diesem Fall ändert sich die Terminalanzeige wie folgt.
Terminal
Status Migration ID Migration Name
--------------------------------------------------
down 20201114044025 Create books #Es geht von oben nach unten! !! !! !!
Mit anderen Worten, wenn Sie von "hoch" zu "runter" wechseln, wird die Datenbank wieder auf den Stand vor "Rails db: migrate" zurückgesetzt.
Da wir vor db: migrate zurückgekehrt sind, können wir der zuerst erstellten Migrationsdatei die Spalte title
hinzufügen.
db/migrate/20201114044025_create_books.rb
class CreateGenres < ActiveRecord::Migration[5.2]
def change
create_table :books do |t|
t.string :title #Fügen Sie hier eine Titelspalte hinzu! !! !! !!
t.timestamps
end
end
end
Wenn Sie danach die Migrationsdatei wie in Muster (1) ausführen, wird die Spalte "Titel" hinzugefügt.
Befehl
rails db:migrate
db/schema.rb
ActiveRecord::Schema.define(version: 2020_11_14_044025) do
create_table "books", force: :cascade do |t|
t.string "title" #Eine Titelspalte wurde hinzugefügt! !! !! !!
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Das Ändern der Migrationsdatei ist oft sensibler als erwartet, daher wurde ich daran erinnert, dass ich mit einem soliden Verständnis für das Timing und die Reihenfolge daran arbeiten sollte. Ich habe noch etwas gelernt! !!
Recommended Posts