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 auf rails 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:

5,0
rake db:migrate:up VERSION=20090408054555
5,0
rails db:migrate:up VERSION=20090408054555 

Hinunter eine bestimmte Migration:

5,0
rake db:migrate:down VERSION=20090408054555
5,0
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
5,0

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:

5,0
rake db:migrate
5,0
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.

5,0
rake db:migrate VERSION=20080906120000
5,0
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:

5,0
rake db:rollback
5,0
rails db:rollback

Rollback der letzten 3 Migrationen

5,0
rake db:rollback STEP=3
5,0
rails db:rollback STEP=3

STEP gibt die Anzahl der Migrationen an, die zurückgesetzt werden sollen.

Alle Migrationen rückgängig machen

5,0
rake db:rollback VERSION=0
5,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:

  1. t.remove :ordered_at entfernt die Spalte ordered_at aus der Tabelle orders .
  2. t.string :skew_number fügt eine neue Zeichenfolgenspalte namens skew_number in die orders .
  3. t.index :skew_number fügt einen Index für die Spalte skew_number in der orders .
  4. t.rename :location, :state benennt die location in der orders in state .

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:

5,0
rake db:migrate:redo
5,0
rails db:migrate:redo

Mit dem STEP Parameter können Sie mehrere Versionen zurückgeben.

So gehen Sie beispielsweise 3 Migrationen zurück:

5,0
rake db:migrate:redo STEP=3
5,0
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:

  1. Fügen Sie eine add_column -migration ähnlich der obigen hinzu, legen Sie jedoch keinen Standard fest
  2. 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.
  3. 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

3,0 5,0
rake db:migrate:status
5,0
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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow