Ruby on Rails: Migracje
From Nasza Pasja - Programowanie
Bardziej aktualna wersja jest tutaj
Czyli migrations mówiąc po railsowemu ;)
O co właściwie chodzi ? Migracje pozwalają w wygodny sposób zarządzać strukturą bazy danych. Do ich użycia nie jest konieczna znajomość SQL, a niosą ze sobą wiele plusów:
- można uruchomić tą samą migrację dla różnych typów baz danych (MySQL, SQLite, PostgreSQL, itd..), nie musisz się martwić jak zrealizować daną rzecz na konkretnej bazie danych
- migrację pozwalają w łatwy sposób utworzyć/przywrócić strukturę bazy
- obsługiwane są wersje, dzięki czemu możesz w łatwy sposób upgrade'ować lub downgrade'ować strukturę bazy
- ich przygotowywanie jest znacznie wygodniejsze oż recznego wklepywania SQL np. to tworzenia tabeli
Spis treści |
Podstawy
Po wygenerowaniu modelu Ruby on Rails tworzy nam automatycznie schemat migracji w pliku wyglądającym np. tak db/migrate/001_create_notes.rb dla modelu Note
class CreateNotes < ActiveRecord::Migration
def self.up
create_table :notes do |t|
# t.column :name, :string
end
end
def self.down
drop_table :notes
end
end
Jeżeli chcemy sami stworzyć nową migrację, używamy Generatora:
script/generate migration NazwaMigracji
Aby zaktualizować schemat bazy danych zgodnie ze skryptami migracji wydajemy polecenie:
rake db:migrate
Opcjonalnie możemy podać wersję np:
rake db:migrate VERSION=3
Typy danych
Jak widac w schemacie przykładowej migracji do każdego pola podajemy typ danych, oto jakie typy mamy dostępne:
- :integer - liczby całkowite
- :float - liczba zmiennoprzecinkowa
- :string - tekst, krótki
- :text - długie pole tekstowe
- :datetime - data i czas
- :date - data
- :time - czas
- :timestamp - data i czas przechowywana w postaci timestamp (zazwyczaj liczba sekund od 1970r.)
- :boolean - wartość logiczna
- :binary - pole binarne
- :bigint - duże liczby całkowite
Opcje kolumn
- :default - wartość domyślna
- :null - czy pole może przyjąć wartość NULL
- :limit - ograniczenie długości stringa
Opcje tabel
- :id - czy ma być utworzone pole id (używane jako klucz podstawowy). Domyślnie true
Dostępne operacje
- create_table(nazwa, opcje) - utworzenie nowej tabeli
create_table :notes do |t| t.column :name, :string, :limit => 100, :null => false t.column :, :string, :limit => 100, :null => false end
- drop_table(nazwa) - usunięcie tabeli
drop_table :notes
- rename_table(nazwa, nowa_nazwa) - zmiana nazwy tabeli
rename_table :notes, :notki
- add_column(nazwa_tabeli, nazwa_kolumny, opcje) - dodanie kolumny do tabeli
add_column :notki, :comments_count, :integer
- rename_column(nazwa_tabeli, nazwa_kolmny, nowa_nazwa_kolumny) - zmiana nazwy kolumny
rename_column :notki, :name, :title
- change_column(nazwa_tabeli, nazwa_kolumny, typ_kolumny, opcje) - modyfikacja kolumny
change_kolumn :notki, :title, :string, :limit => 145
- remove_column(nazwa_tabeli, nazwa_kolumny) - usunięcie kolumny
- add_index(nazwa_tabeli, nazwa_kolumn0y, typ_indeksu, nazwa_indeksu) - dodanie indeksu do kolumny
- remove_index(nazwa_tabeli, nazwa_indeksu) - usunięcie indeksu
Dodatkowe informacje
Czasami gdy zmienimy strukturę tabeli a następnie chcemy wykonać jakieś operacje na danych w niej zawartych przydaje się przeładowanie informacji o kolumnach tabeli, służy do tego metoda reset_column_information np dla zmieniamy cos w tabeli notes po czym przepisujemy wszystkie pola
add_column :notes, :title_copy, :string
Note.reset_column_information
Note.find(:all).each do |n|
n.title_copy = n.title
end
# tylko po co komu kopia tematu ? ;p

