47.10. Migrace / Migrations

47.10.1. Vytvoření migrace generátorem
47.10.2. Vytvoření migrace nového modelu
47.10.3. Změna dat v migracích
47.10.4. Migration Cheat Sheet

section id="rails.migrations"

Migrace jsou nástroj pomocí kterého můžeme udržovat strukturu své databáze. Jsou pro databázi tím, čím je pro programový kód systém správy verzí. Jednotlivé migrační soubory jsou uloženy v adresáři db/migrate a jejich jména začínají třemi číslicemi oddělenýmy od názvu migrace znakem '_'. Název migrace je libovolný popisný text který má vypovídat co migrace dělá. Tímto číslem, číslování začíná od čísla 1 jsou migrace jednoznačně určeny a toto číslo současně označuje verzi databázové struktury. Obsah migračních souborů tvoří dvě metody, self.up a self.down, popisující jakým způsobem se mění struktura při upgrade z předchozí verze na označenou verzi a při downgrade z označené verze na verzi předcházející. Postupným prováděním jednotlivých migrací můžeme upgradovat nebo downgradovat strukturu databáze na libovolnou verzi. Můžeme se tedy vrátit k libovolné verzi databázové struktury od okamžiku kdy jsme začali migrace používat. K tomu aby migrace správně fungovali, potřebují znát aktuální verzi databáze. Toto číslo je poznamenáno v jediném řádku tabulky schema_info obsahující jediný sloupec version typu 〈integer 〉. Dále migrace udržují ještě jeden soubor a to db/schema.rb popisující aktuální strukturu databáze stejným způsobem jako v samotných migracích.

Přeformulovat přdchozí odstavec.

Prvním krokem k používání migrací který uděláme je, že si vytvoříme již zmíněný soubor db/schema.rb popisující aktuální strukturu databáze.

$ rake db:schema:dump

Pokud je naše databáze prázdná, výsledkem bude soubor který její strukturu popisuje takto:

ActiveRecord::Schema.define() do

end

Pok

WORKING: Editovat.

Vytvoříme databáze, vytvoříme náš projekt a nakonfigurujeme přístup k databázi v konfiguračním souboru config/database.yml. Jestli jsme neudělali chybu si ověříme příkazem

$ rake db:schema:dump

Tento příkaz se připojí k databázi a vytvoří soubor db/schema.rb popisující strukturu databáze. Pokud je naše databáze prázdná (čistě vytvořená), neobsahuje žádné tabulky a schema.rb ji popisuje takto:

ActiveRecord::Scheme.define() do
end

Nyní přistoupíme k tvorbě datového modelu a struktury databáze. Začneme vytvořením modelu

$ script/generate model Person
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/person.rb
      create  test/unit/person_test.rb
      create  test/fixtures/people.yml
      create  db/migrate
      create  db/migrate/001_create_people.rb

Všiměte si, že mimo vlastního modelu (soubor app/models/person.rb) je vytvořena i migrace na verzi databáze 1 v souboru db/migrate/001_create_people.rb. Tato obsahuje zatím pouze vytvoření a odstranění tabulky people.

class CreatePeople < ActiveRecord::Migration
  def self.up
    create_table :people do |t|
      t.timestamps
    end
  end

  def self.down
    drop_table :people
  end
end

Dve mětody této migrace se spouští při upgrade z předchozí verze na verzidefinovanou migrací (self.up) a při downgrade o verzi níže (self.down.

Při vlastních migracích se spouštějí v daném pořadí metody self.up a self.down podle toho ke které verzi databáze chceme migrovat. V databázi je tabulka schema_info osahující jediný sloupec version se jedinou číselnou hodnotou určující na jaké verzi se právě databáze nachází. Voláním

$ rake db:migrate

Přejdeme k nejvyšší definované verzi a příkazem

$ rake db:migrate VERSION=číslo

pak ke konkrétní verzi. Číslo 0 znamená návrat před migraci číslo 1 což v připadě že jsme celou strukturu databáze udržovali pouze v migracích znamená návrat k prázdné databázi.

Od verze Ruby on Rails 2.0 má rake ještě jednu úlohu a to:

$ rake db:rollback

Ale teď zpět k migracím a k definici sloupců v tabulce. Tyto definice jsou tvaru:

t.column :název-sloupce, :typ-dat [ volby ]

Jsou možné tyto typy dat:

Tabulka 47.1. Typy dat v migracích

název  
:binary  
:boolean  
:date  
:datetime  
:decimal  
:float  
:integer  
:string  
:text  
:time  
:timestamp  

Tabulka 47.2.

názevtyp hodnotvýznam
:limitčíslodélka pole, například maximální délka řetězce
:defaultlibovolná dle typudefaultní/implicitní hodnota pokud není zadána
:nulltrue | falsezdali je přípustná hodnota NULL (nil)
:precision  
:scale  

Od verze Ruby on Rails 2.0 je možno popisovat sloupce způsobem:

t.typ-dat :název-sloupce [, volby ]

K dispozici je rovněž speciální hodnota/typ sloupce

t.timestamps

Tento zápis znamená:

t.column :created_at, :datetime
t.column :updated_at, :datetime

Tabulka 47.3. Příkazy migrací

tabulkyadd_table, drop_table, rename_table
sloupceadd_column, remove_column, rename_column, change_column
indexyadd_index, remove_index

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .