Szukaj…


Parametry

Typ kolumny Opis
:primary_key Klucz podstawowy
:string Typ danych o krótszym ciągu. Umożliwia limit opcji dla maksymalnej liczby znaków.
:text Dłuższa ilość tekstu. Pozwala na limit opcji dla maksymalnej liczby bajtów.
:integer Liczba całkowita. Pozwala na limit opcji dla maksymalnej liczby bajtów.
:bigint Większa liczba całkowita
:float Pływak
:decimal Liczba dziesiętna ze zmienną precyzją. Umożliwia precision i scale opcji.
:numeric Umożliwia precision i scale opcji.
:datetime Obiekt DateTime dla dat / godzin.
:time Obiekt czasu dla czasów.
:date Obiekt daty dla dat.
:binary Dane binarne. Pozwala na limit opcji dla maksymalnej liczby bajtów.
:boolean Boolean

Uwagi

  • Większość plików migracji znajduje się w katalogu db/migrate/ . Są identyfikowane przez znacznik czasu UTC na początku nazwy pliku: YYYYMMDDHHMMSS_create_products.rb .

  • Polecenie rails generate można skrócić do rails g .

  • Jeśli :type nie jest przekazywany do pola, domyślnie jest to ciąg.

Uruchom określoną migrację

Aby uruchomić określoną migrację w górę lub w dół, użyj db:migrate:up lub db:migrate:down .

W górę określonej migracji:

5.0
rake db:migrate:up VERSION=20090408054555
5.0
rails db:migrate:up VERSION=20090408054555 

W dół określonej migracji:

5.0
rake db:migrate:down VERSION=20090408054555
5.0
rails db:migrate:down VERSION=20090408054555

Numer wersji w powyższych poleceniach jest prefiksem numerycznym w nazwie pliku migracji. Na przykład, aby przeprowadzić migrację do wersji 20160515085959_add_name_to_users.rb , należy użyć 20160515085959 jako numeru wersji.

Utwórz tabelę łączenia

Aby utworzyć tabelę łączenia students i courses , uruchom polecenie:

$ rails g migration CreateJoinTableStudentCourse student course

Spowoduje to wygenerowanie następującej migracji:

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

Uruchamianie migracji w różnych środowiskach

Aby uruchomić migrację w środowisku test , uruchom następujące polecenie powłoki:

rake db:migrate RAILS_ENV=test
5.0

Począwszy od wersji Rails 5.0, możesz używać rails zamiast rake :

rails db:migrate RAILS_ENV=test

Dodaj nową kolumnę do tabeli

Aby dodać nową name kolumny do tabeli users , uruchom polecenie:

rails generate migration AddNameToUsers name

Generuje to następującą migrację:

class AddNameToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :name, :string
  end
end

Gdy nazwa migracji ma postać AddXXXToTABLE_NAME po której następuje lista kolumn z typami danych, wygenerowana migracja będzie zawierać odpowiednie instrukcje add_column .

Dodaj nową kolumnę z indeksem

Aby dodać nowy email kolumną indeksowaną do tabeli users , uruchom polecenie:

rails generate migration AddEmailToUsers email:string:index

Spowoduje to wygenerowanie następującej migracji:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
    add_index :users, :email
  end
end

Usuń istniejącą kolumnę z tabeli

Aby usunąć istniejącą name kolumny z tabeli users , uruchom polecenie:

rails generate migration RemoveNameFromUsers name:string

Spowoduje to wygenerowanie następującej migracji:

class RemoveNameFromUsers < ActiveRecord::Migration[5.0]
  def change
    remove_column :users, :name, :string
  end
end

Gdy nazwa migracji ma postać RemoveXXXFromYYY po której następuje lista kolumn z typami danych, wówczas wygenerowana migracja będzie zawierać odpowiednie instrukcje remove_column .

Chociaż nie jest wymagane określenie typu danych (np . :string ) jako parametru do remove_column , jest wysoce zalecane. Jeśli typ danych nie zostanie określony, migracja nie będzie odwracalna.

Dodaj kolumnę referencyjną do tabeli

Aby dodać odwołanie do team do tabeli users , uruchom następujące polecenie:

$ rails generate migration AddTeamRefToUsers team:references

Generuje to następującą migrację:

class AddTeamRefToUsers < ActiveRecord::Migration[5.0]
  def change
    add_reference :users, :team, foreign_key: true
  end
end

Ta migracja spowoduje utworzenie kolumny team_id w tabeli users .

Jeśli chcesz dodać odpowiedni index i foreign_key do dodanej kolumny, zmień polecenie na rails generate migration AddTeamRefToUsers team:references:index . Spowoduje to wygenerowanie następującej migracji:

class AddTeamRefToUsers < ActiveRecord::Migration
  def change
    add_reference :users, :team, index: true
    add_foreign_key :users, :teams
  end
end

Jeśli chcesz wymienić swój kolumnę odniesienia innego niż to, co Szyny automatycznie generuje, dodać następujące migracji: (np: Możesz też zadzwonić do User , który stworzył ten Post jako Author w Post tabeli)

class AddAuthorRefToPosts < ActiveRecord::Migration
  def change
    add_reference :posts, :author, references: :users, index: true
  end
end

Utwórz nowy stół

Aby utworzyć nową tabelę users z name kolumny i salary , uruchom polecenie:

rails generate migration CreateUsers name:string salary:decimal

Spowoduje to wygenerowanie następującej migracji:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.decimal :salary  
    end
  end
end

Gdy nazwa migracji ma postać CreateXXX po której następuje lista kolumn z typami danych, zostanie wygenerowana migracja, która utworzy tabelę XXX z wymienionymi kolumnami.

Dodawanie wielu kolumn do tabeli

Aby dodać wiele kolumn do tabeli, oddzielne field:type pary ze spacjami podczas korzystania z polecenia rails generate migration .

Ogólna składnia to:

rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]

Na przykład następujące elementy dodają pola z name , salary i salary email - email do tabeli users :

rails generate migration AddDetailsToUsers name:string salary:decimal email:string

Co generuje następującą migrację:

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

Uruchamianie migracji

Uruchom polecenie:

5.0
rake db:migrate
5.0
rails db:migrate

Określenie wersji docelowej spowoduje uruchomienie wymaganych migracji (góra, dół, zmiana), dopóki nie osiągnie określonej wersji. Tutaj version number to numeryczny prefiks w nazwie pliku migracji.

5.0
rake db:migrate VERSION=20080906120000
5.0
rails db:migrate VERSION=20080906120000

Cofanie migracji

Aby rollback najnowszą migrację, albo przez rollback metody change , albo przez uruchomienie metody down . Uruchom polecenie:

5.0
rake db:rollback
5.0
rails db:rollback

Cofnij ostatnie 3 migracje

5.0
rake db:rollback STEP=3
5.0
rails db:rollback STEP=3

STEP podaj liczbę migracji do przywrócenia.

Cofnij wszystkie migracje

5.0
rake db:rollback VERSION=0
5.0
rails db:rollback VERSION=0

Przewijanie tabel

Jeśli utworzyłeś tabelę z niewłaściwym schematem, najłatwiejszym sposobem na zmianę kolumn i ich właściwości jest change_table . Przejrzyj następujący przykład:

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

Powyższa migracja zmienia orders tabel. Oto opis zmian linia po linii:

  1. t.remove :ordered_at usuwa kolumnę ordered_at z orders tabeli.
  2. t.string :skew_number dodaje nową kolumnę typu string o nazwie skew_number w tabeli orders .
  3. t.index :skew_number dodaje indeks do kolumny skew_number w tabeli orders .
  4. t.rename :location, :state zmienia nazwę kolumny location w tabeli orders na state .

Dodaj unikalną kolumnę do tabeli

Aby dodać nową unikalną email kolumny do users , uruchom następujące polecenie:

rails generate migration AddEmailToUsers email:string:uniq

Spowoduje to utworzenie następującej migracji:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
    add_index :users, :email, unique: true
  end
end

Zmień istniejący typ kolumny

Aby zmodyfikować istniejącą kolumnę w Railsach podczas migracji, uruchom następujące polecenie:

rails g migration change_column_in_table

Spowoduje to utworzenie nowego pliku migracji w katalogu db/migration (jeśli jeszcze nie istnieje), który będzie zawierał plik z przedrostkiem czasu i nazwą pliku migracji, który zawiera poniższą treść:

def change
  change_column(:table_name, :column_name, :new_type)
end

Przewodnik po szynach - zmiana kolumn

Dłuższa, ale bezpieczniejsza metoda

Powyższy kod zapobiega cofnięciu migracji przez użytkownika. Możesz uniknąć tego problemu, dzieląc metodę change na osobne metody w up i w down :

def up
  change_column :my_table, :my_column, :new_type
end

def down
  change_column :my_table, :my_column, :old_type
end

Ponów migracje

Możesz wycofać, a następnie ponownie przeprowadzić migrację za pomocą polecenia redo . Jest to w zasadzie skrót, który łączy zadania rollback i migrate .

Uruchom polecenie:

5.0
rake db:migrate:redo
5.0
rails db:migrate:redo

Za pomocą parametru STEP można cofnąć więcej niż jedną wersję.

Na przykład, aby cofnąć 3 migracje:

5.0
rake db:migrate:redo STEP=3
5.0
rails db:migrate:redo STEP=3

Dodaj kolumnę z wartością domyślną

Poniższy przykład dodaje admin kolumny do tabeli users i nadaje tej kolumnie domyślną wartość false .

class AddDetailsToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

Migracje z ustawieniami domyślnymi mogą zająć dużo czasu w dużych tabelach, na przykład PostgreSQL. Jest tak, ponieważ każdy wiersz będzie musiał zostać zaktualizowany o wartość domyślną dla nowo dodanej kolumny. Aby to obejść (i skrócić przestoje podczas wdrażania), możesz podzielić migrację na trzy kroki:

  1. Dodaj add_column add_column podobną do powyższej, ale nie ustawiaj domyślnej
  2. Wdróż i zaktualizuj kolumnę w zadaniu prowizji lub na konsoli, gdy aplikacja jest uruchomiona. Upewnij się, że aplikacja już zapisuje dane w tym kolumnie dla nowych / zaktualizowanych wierszy.
  3. Dodaj kolejną migrację change_column , która następnie zmieni domyślną kolumnę na żądaną wartość domyślną

Zabroń wartości zerowych

Aby zabronić wartości null w kolumnach tabeli, dodaj do migracji parametr :null :

class AddPriceToProducts < ActiveRecord::Migration
  def change
    add_column :products, :float, null: false
  end
end

Sprawdzanie statusu migracji

Możemy sprawdzić status migracji, uruchamiając

3.0 5.0
rake db:migrate:status
5.0
rails db:migrate:status

Dane wyjściowe będą wyglądać następująco:

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 **********

Pod polem statusu w up oznacza, że migracja została uruchomiona, a w down oznacza, że musimy ją uruchomić.

Utwórz kolumnę hstore

Kolumny Hstore mogą być przydatne do przechowywania ustawień. Są one dostępne w bazach danych PostgreSQL po włączeniu rozszerzenia.

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

Dodaj własne odniesienie

Własne odniesienie może być przydatne do zbudowania hierarchicznego drzewa. Można to osiągnąć za pomocą add_reference w migracji.

class AddParentPages < ActiveRecord::Migration[5.0]
  def change
    add_reference :pages, :pages
  end
end

Kolumna klucza obcego to pages_id . Jeśli chcesz zdecydować o nazwie kolumny klucza obcego, musisz najpierw utworzyć kolumnę, a następnie dodać odwołanie.

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

Utwórz kolumnę tablicy

Kolumna array obsługiwana jest przez PostgreSQL. Railsy automatycznie przekonwertują tablicę PostgreSQL na tablicę Ruby i odwrotnie.

Utwórz tabelę z kolumną array :

create_table :products do |t|
  t.string :name
  t.text :colors, array: true, default: []
end

Dodaj kolumnę array do istniejącej tabeli:

add_column :products, :colors, array: true, default: []

Dodaj indeks do kolumny array :

add_index :products, :colors, using: 'gin'

Dodanie ograniczenia NOT NULL do istniejących danych

Załóżmy, że chcesz dodać klucz obcy company_id do tabeli users i chcesz mieć na nim ograniczenie NOT NULL . Jeśli masz już dane users , musisz to zrobić w kilku krokach.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow