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 generate
można skrócić dorails 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:
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_at
usuwa kolumnęordered_at
zorders
tabeli. -
t.string :skew_number
dodaje nową kolumnę typu string o nazwieskew_number
w tabeliorders
. -
t.index :skew_number
dodaje indeks do kolumnyskew_number
w tabeliorders
. -
t.rename :location, :state
zmienia nazwę kolumnylocation
w tabeliorders
nastate
.
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_column
add_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