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:dumpPokud 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:dumpTento 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
endDve 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:migratePř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:rollbackAle 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 |
