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