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 Personexists 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ázev | typ hodnot | význam |
---|---|---|
:limit | číslo | délka pole, například maximální délka řetězce |
:default | libovolná dle typu | defaultní/implicitní hodnota pokud není zadána |
:null | true | false | zdali 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í
tabulky | add_table, drop_table, rename_table |
sloupce | add_column, remove_column, rename_column, change_column |
indexy | add_index, remove_index |