Ruby on Rails
ActiveRecord-Migrationen
Suche…
Parameter
Säulentyp | Beschreibung |
---|---|
:primary_key | Primärschlüssel |
:string | Kürzerer String-Datentyp. Ermöglicht die limit für die maximale Anzahl von Zeichen. |
:text | Längere Textmenge Erlaubt die limit für die maximale Anzahl von Bytes. |
:integer | Ganze Zahl. Erlaubt die limit für die maximale Anzahl von Bytes. |
:bigint | Größere ganze Zahl |
:float | Schweben |
:decimal | Dezimalzahl mit variabler Genauigkeit. Ermöglicht precision und scale . |
:numeric | Ermöglicht precision und scale . |
:datetime | DateTime-Objekt für Datum und Uhrzeit. |
:time | Zeitobjekt für Zeiten. |
:date | Datumsobjekt für Datumsangaben |
:binary | Binärdaten. Erlaubt die limit für die maximale Anzahl von Bytes. |
:boolean | Boolean |
Bemerkungen
Die meisten Migrationsdateien befinden sich im Verzeichnis
db/migrate/
. Sie werden durch einen UTC-Zeitstempel am Anfang ihres Dateinamens identifiziert:YYYYMMDDHHMMSS_create_products.rb
.Der Befehl zum
rails generate
kann aufrails g
gekürzt werden.Wenn ein
:type
nicht an ein Feld übergeben wird, wird standardmäßig eine Zeichenfolge verwendet.
Führen Sie eine bestimmte Migration aus
Verwenden Sie db:migrate:up
oder db:migrate:down
um eine bestimmte Migration nach oben oder unten auszuführen.
Eine bestimmte Migration durchführen:
rake db:migrate:up VERSION=20090408054555
rails db:migrate:up VERSION=20090408054555
Hinunter eine bestimmte Migration:
rake db:migrate:down VERSION=20090408054555
rails db:migrate:down VERSION=20090408054555
Die Versionsnummer in den obigen Befehlen ist das numerische Präfix im Dateinamen der Migration. Um beispielsweise zur Migration 20160515085959_add_name_to_users.rb
zu migrieren, verwenden Sie 20160515085959
als Versionsnummer.
Erstellen Sie eine Join-Tabelle
Führen Sie den Befehl aus, um eine Verbindungstabelle zwischen students
und courses
zu erstellen
$ rails g migration CreateJoinTableStudentCourse student course
Dadurch wird die folgende Migration generiert:
class CreateJoinTableStudentCourse < ActiveRecord::Migration[5.0]
def change
create_join_table :students, :courses do |t|
# t.index [:student_id, :course_id]
# t.index [:course_id, :student_id]
end
end
end
Migrationen in verschiedenen Umgebungen ausführen
Führen Sie den Shell-Befehl aus, um Migrationen in der test
auszuführen:
rake db:migrate RAILS_ENV=test
Ab Rails 5.0 können Sie anstelle von rake
rails
verwenden:
rails db:migrate RAILS_ENV=test
Fügen Sie einer Tabelle eine neue Spalte hinzu
Um eine neue Spalte hinzufügen name
an die users
- Tabelle, führen Sie den Befehl:
rails generate migration AddNameToUsers name
Dies generiert die folgende Migration:
class AddNameToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
end
end
Wenn der Migrationsname die Form AddXXXToTABLE_NAME
gefolgt von einer Liste von Spalten mit Datentypen hat, enthält die generierte Migration die entsprechenden Anweisungen add_column
.
Fügen Sie eine neue Spalte mit einem Index hinzu
Führen Sie den Befehl aus, um eine neue indizierte Spalten- email
zur users
hinzuzufügen:
rails generate migration AddEmailToUsers email:string:index
Dadurch wird die folgende Migration generiert:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email
end
end
Entfernen Sie eine vorhandene Spalte aus einer Tabelle
Zum Entfernen der vorhandenen name
von users
Tabelle, führen Sie den Befehl:
rails generate migration RemoveNameFromUsers name:string
Dadurch wird die folgende Migration generiert:
class RemoveNameFromUsers < ActiveRecord::Migration[5.0]
def change
remove_column :users, :name, :string
end
end
Wenn der Migrationsname die Form RemoveXXXFromYYY
gefolgt von einer Liste von Spalten mit Datentypen, enthält die generierte Migration die entsprechenden Anweisungen remove_column
.
Zwar ist es nicht erforderlich, den Datentyp (z. B :string
) als Parameter für remove_column
, es wird jedoch dringend empfohlen. Wenn der Datentyp nicht angegeben ist, ist die Migration nicht reversibel.
Fügen Sie einer Tabelle eine Referenzspalte hinzu
Führen Sie den folgenden Befehl aus, um einem team
einen Verweis auf die users
hinzuzufügen:
$ rails generate migration AddTeamRefToUsers team:references
Dies generiert die folgende Migration:
class AddTeamRefToUsers < ActiveRecord::Migration[5.0]
def change
add_reference :users, :team, foreign_key: true
end
end
Diese Migration erstellt eine team_id
Spalte in der users
.
Wenn Sie für die hinzugefügte Spalte einen geeigneten index
und ein foreign_key
hinzufügen möchten, ändern Sie den Befehl in rails generate migration AddTeamRefToUsers team:references:index
zu rails generate migration AddTeamRefToUsers team:references:index
. Dadurch wird die folgende Migration generiert:
class AddTeamRefToUsers < ActiveRecord::Migration
def change
add_reference :users, :team, index: true
add_foreign_key :users, :teams
end
end
Wenn Sie Ihre Referenzspalte anders benennen möchten als die, die Rails automatisch generiert, fügen Sie der Migration Folgendes hinzu: (ZB: Sie möchten möglicherweise den User
aufrufen, der den Post
als Author
in der Tabelle " Post
).
class AddAuthorRefToPosts < ActiveRecord::Migration
def change
add_reference :posts, :author, references: :users, index: true
end
end
Erstellen Sie eine neue Tabelle
Um eine neue zu erstellen users
Tabelle mit den Spalten name
und salary
, führen Sie den Befehl:
rails generate migration CreateUsers name:string salary:decimal
Dadurch wird die folgende Migration generiert:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.decimal :salary
end
end
end
Wenn der Migrationsname die Form CreateXXX
gefolgt von einer Liste von Spalten mit Datentypen, wird eine Migration generiert, die die Tabelle XXX
mit den aufgelisteten Spalten erstellt.
Mehrere Spalten zu einer Tabelle hinzufügen
Wenn Sie einer Tabelle mehrere Spalten hinzufügen möchten, müssen Sie ein separates field:type
Geben Sie bei Verwendung von rails generate migration
Leerzeichen ein, um rails generate migration
.
Die allgemeine Syntax lautet:
rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]
Die folgende Tabelle fügt der users
beispielsweise name
, salary
und email
Felder hinzu:
rails generate migration AddDetailsToUsers name:string salary:decimal email:string
Was erzeugt die folgende Migration:
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
add_column :users, :salary, :decimal
add_column :users, :email, :string
end
end
Migrationen ausführen
Führen Sie den Befehl aus:
rake db:migrate
rails db:migrate
Durch die Angabe der Zielversion werden die erforderlichen Migrationen (Up, Down, Change) ausgeführt, bis die angegebene Version erreicht ist. Die version number
ist hier das numerische Präfix des Dateinamens der Migration.
rake db:migrate VERSION=20080906120000
rails db:migrate VERSION=20080906120000
Rollback-Migrationen
Um ein rollback
die letzte Migration, entweder durch das Rückgriff change
Verfahren oder indem Sie die down
Methode. Führen Sie den Befehl aus:
rake db:rollback
rails db:rollback
Rollback der letzten 3 Migrationen
rake db:rollback STEP=3
rails db:rollback STEP=3
STEP
gibt die Anzahl der Migrationen an, die zurückgesetzt werden sollen.
Alle Migrationen rückgängig machen
rake db:rollback VERSION=0
rails db:rollback VERSION=0
Tabellen wechseln
Wenn Sie eine Tabelle mit einem falschen Schema erstellt haben, können Sie die Spalten und ihre Eigenschaften am einfachsten mit change_table
. Überprüfen Sie das folgende Beispiel:
change_table :orders do |t|
t.remove :ordered_at # removes column ordered_at
t.string :skew_number # adds a new column
t.index :skew_number #creates an index
t.rename :location, :state #renames location column to state
end
Die obige Migration ändert eine Tabelle orders
. Hier ist eine zeilenweise Beschreibung der Änderungen:
-
t.remove :ordered_at
entfernt die Spalteordered_at
aus der Tabelleorders
. -
t.string :skew_number
fügt eine neue Zeichenfolgenspalte namensskew_number
in dieorders
. -
t.index :skew_number
fügt einen Index für die Spalteskew_number
in derorders
. -
t.rename :location, :state
benennt dielocation
in derorders
instate
.
Fügen Sie einer Tabelle eine eindeutige Spalte hinzu
Führen Sie den folgenden Befehl aus, um users
eine neue eindeutige Spalten- email
hinzuzufügen:
rails generate migration AddEmailToUsers email:string:uniq
Dadurch wird die folgende Migration erstellt:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email, unique: true
end
end
Ändern Sie den Typ einer vorhandenen Spalte
Führen Sie den folgenden Befehl aus, um eine vorhandene Spalte in Rails mit einer Migration zu ändern:
rails g migration change_column_in_table
Dadurch wird eine neue Migrationsdatei im Verzeichnis db/migration
(sofern noch nicht vorhanden), die die Datei mit dem Präfix timestamp und migrationsdatei enthält, die den folgenden Inhalt enthält:
def change
change_column(:table_name, :column_name, :new_type)
end
Rails Guide - Spalten wechseln
Eine längere aber sicherere Methode
Der obige Code verhindert, dass der Benutzer die Migration jemals rückgängig macht. Sie können dieses Problem vermeiden, indem Sie die change
in getrennte up
und down
aufteilen:
def up
change_column :my_table, :my_column, :new_type
end
def down
change_column :my_table, :my_column, :old_type
end
Migrationen wiederholen
Sie können mit dem Befehl " redo
einen Rollback ausführen und dann erneut migrieren. Dies ist im Grunde eine Verknüpfung, die rollback
und migrate
kombiniert.
Führen Sie den Befehl aus:
rake db:migrate:redo
rails db:migrate:redo
Mit dem STEP
Parameter können Sie mehrere Versionen zurückgeben.
So gehen Sie beispielsweise 3 Migrationen zurück:
rake db:migrate:redo STEP=3
rails db:migrate:redo STEP=3
Spalte mit Standardwert hinzufügen
Im folgenden Beispiel wird der users
eine Spalte admin
, und dieser Spalte wird der Standardwert false
.
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
Migrationen mit Standardwerten können in großen Tabellen mit beispielsweise PostgreSQL sehr lange dauern. Dies liegt daran, dass jede Zeile mit dem Standardwert für die neu hinzugefügte Spalte aktualisiert werden muss. Um dies zu umgehen (und Ausfallzeiten während der Bereitstellung zu reduzieren), können Sie die Migration in drei Schritte unterteilen:
- Fügen Sie eine
add_column
-migration ähnlich der obigen hinzu, legen Sie jedoch keinen Standard fest - Stellen Sie die Spalte in einer Rake-Task oder auf der Konsole bereit, und aktualisieren Sie sie, während Ihre App ausgeführt wird. Stellen Sie sicher, dass Ihre Anwendung bereits Daten für neue / aktualisierte Zeilen in diese Spalte schreibt.
- Fügen Sie eine weitere
change_column
Migration hinzu, die dann den Standardwert dieser Spalte in den gewünschten Standardwert ändert
Nullwerte verbieten
Um null
in Ihren Tabellenspalten zu verbieten, fügen Sie Ihrer Migration den :null
Parameter hinzu:
class AddPriceToProducts < ActiveRecord::Migration
def change
add_column :products, :float, null: false
end
end
Migrationsstatus überprüfen
Wir können den Status von Migrationen durch Ausführen überprüfen
rake db:migrate:status
rails db:migrate:status
Die Ausgabe sieht folgendermaßen aus:
Status Migration ID Migration Name
--------------------------------------------------
up 20140711185212 Create documentation pages
up 20140724111844 Create nifty attachments table
up 20140724114255 Create documentation screenshots
up 20160213170731 Create owners
up 20160218214551 Create users
up 20160221162159 ********** NO FILE **********
up 20160222231219 ********** NO FILE **********
Unter dem Statusfeld up
bedeutet , dass die Migration ausgeführt wurde und down
bedeutet , dass wir die Migration ausgeführt werden müssen.
Erstellen Sie eine Hstore-Spalte
Hstore
Spalten können zum Speichern von Einstellungen nützlich sein. Sie sind in PostgreSQL-Datenbanken verfügbar, nachdem Sie die Erweiterung aktiviert haben.
class CreatePages < ActiveRecord::Migration[5.0]
def change
create_table :pages do |t|
enable_extension 'hstore' unless extension_enabled?('hstore')
t.hstore :settings
t.timestamps
end
end
end
Fügen Sie einen Selbstverweis hinzu
Eine Selbstreferenz kann hilfreich sein, um einen hierarchischen Baum aufzubauen. Dies kann mit add_reference
in einer Migration erreicht werden.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_reference :pages, :pages
end
end
Die Fremdschlüsselspalte pages_id
. Wenn Sie den Namen der Fremdschlüsselspalte festlegen möchten, müssen Sie zuerst die Spalte erstellen und anschließend die Referenz hinzufügen.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_column :pages, :parent_id, :integer, null: true, index: true
add_foreign_key :pages, :pages, column: :parent_id
end
end
Erstellen Sie eine Array-Spalte
Eine array
Spalte wird von PostgreSQL unterstützt. Rails konvertiert ein PostgreSQL-Array automatisch in ein Ruby-Array und umgekehrt.
Erstellen Sie eine Tabelle mit einer array
:
create_table :products do |t|
t.string :name
t.text :colors, array: true, default: []
end
Fügen Sie ein array
Spalte in eine vorhandene Tabelle:
add_column :products, :colors, array: true, default: []
Fügen Sie einen Index für eine array
:
add_index :products, :colors, using: 'gin'
Hinzufügen einer NOT NULL-Einschränkung zu vorhandenen Daten
company_id
, Sie möchten der users
einen Fremdschlüssel company_id
hinzufügen und eine NOT NULL
Einschränkung haben. Wenn Sie bereits Daten in users
haben, müssen Sie dies in mehreren Schritten tun.
class AddCompanyIdToUsers < ActiveRecord::Migration
def up
# add the column with NULL allowed
add_column :users, :company_id, :integer
# make sure every row has a value
User.find_each do |user|
# find the appropriate company record for the user
# according to your business logic
company = Company.first
user.update!(company_id: company.id)
end
# add NOT NULL constraint
change_column_null :users, :company_id, false
end
# Migrations that manipulate data must use up/down instead of change
def down
remove_column :users, :company_id
end
end