Ruby on Rails
Migracje ActiveRecord
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 generatemożna skrócić dorails g.Jeśli
:typenie 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:
rake db:migrate:up VERSION=20090408054555
rails db:migrate:up VERSION=20090408054555
W dół określonej migracji:
rake db:migrate:down VERSION=20090408054555
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
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:
rake db:migrate
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.
rake db:migrate VERSION=20080906120000
rails db:migrate VERSION=20080906120000
Cofanie migracji
Aby rollback najnowszą migrację, albo przez rollback metody change , albo przez uruchomienie metody down . Uruchom polecenie:
rake db:rollback
rails db:rollback
Cofnij ostatnie 3 migracje
rake db:rollback STEP=3
rails db:rollback STEP=3
STEP podaj liczbę migracji do przywrócenia.
Cofnij wszystkie migracje
rake db:rollback VERSION=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:
-
t.remove :ordered_atusuwa kolumnęordered_atzorderstabeli. -
t.string :skew_numberdodaje nową kolumnę typu string o nazwieskew_numberw tabeliorders. -
t.index :skew_numberdodaje indeks do kolumnyskew_numberw tabeliorders. -
t.rename :location, :statezmienia nazwę kolumnylocationw tabeliordersnastate.
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:
rake db:migrate:redo
rails db:migrate:redo
Za pomocą parametru STEP można cofnąć więcej niż jedną wersję.
Na przykład, aby cofnąć 3 migracje:
rake db:migrate:redo STEP=3
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:
- Dodaj
add_columnadd_column podobną do powyższej, ale nie ustawiaj domyślnej - 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.
- 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
rake db:migrate:status
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