V minulém díle jsem nakousl práci s migracemi v Rails. Na konci článku jsem slíbil pokračování, které přichází dnes.

Občas se stane, že migrace provádí něco, co jakmile se provede již nelze vzít zpět. Pro takovéto případy existují ireversibilní neboli nevratné migrace. Takové migrace již nejdou vrátit zpět. Zavoláte-li rake db:migrate VERSION=x a x bude menší než číslo nějaké irefersibilní migrace. Provedou se všechny změny až po onu ireversibilní migraci. Migraci učiníte ireversibilní tak, že v její metodě down bude následující kód:

  def self.down
raise IrreversibleMigration
end

Dump DB schématu

Dump databázového schématu je soubor, ve kterém si Rails (jmenovitě Migrator) ukládají strukturu databáze. Slouží například k vytvoření testovací databáze a používají jej i další Rake tasky. Schéma se nachází v souboru db/schema.rb. Toto se ale dá změnit v konfiguračním souboru environment.rb na řádku:

  # config.active_record.schema_format = :sql

Po vytvoření kostry aplikace je řádek zakomentován a používá se základní hodnota :ruby. Nastavením hodnoty :sql se schéma začne ukládat do souboru db/schema.sql v jazyce SQL. Aktuální schéma databáze lze vytvořit zavoláním Rake tasku db:schema:dump. Pro potřeby tohoto článku budu předpokládat, že používáte základní nastavení (řádek je zakomentován) nebo máte ručně nastaveno :ruby.

Přechod na migrace

Pokud už máte započatý projekt, na kterém jste migrace nepoužívali a chcete začít, postup je docela jednoduchý. Je potřeba zaručit, aby si migrace s vaší databází rozuměly, a aby i znovu-vytvoření databáze fungovalo tak jak má.

První migrace, kterou bude váš projekt obsahovat bude trošku složitější. Musí totiž obsahovat všechny informace o stavu databázového schématu. K tomu se nám bude hodit Rake task db:schema:migrate. Spusťte si ho a jeho výstup (soubor db/schema.rb) si prostudujte. Obsahuje asi následující ruby kód:

# This file is autogenerated. ...

ActiveRecord::Schema.define() do

# volání create table a jiných funkcí...

end

První migraci je nutno vytvořit pomocí generátoru script/generate migration InicializaceDB (nebo jiný vhodný název). Vytvoří se nám migrace 001_inicializace_db.rb, jejíž metodu up naplníme obsahem do…end bloku ze souboru schema.rb. Metodu down si buď můžete ručně napsat sami a smazat v ní všechny tabulky nebo tuto migraci udělat ireversibilní (viz výše).

Pro správnou funkcí migrací je potřeba aby v databázi byla tabulka schema_info. Migrace tuto tabulku v databázi vytvoří samy, ale ještě předtím spustí první migraci. Doporučiji si ji do databáze přidat ručně pomocí následujícího SQL skriptu. Jinak by došlo ke smazání a znovu vytvoření již existujících tabulek a zptrátě dat po spuštění první migrace.

CREATE TABLE `schema_info` ( `version` int(11) default NULL );
INSERT INTO `schema_info` values (1);

Onen INSERT příkaz, je velice důležitý, protože do databáze ukládá informaci o tom, že první migrace už “proběhla” a migrovat se má až od čísla 2. To mimo jiné způsobí, že task db:migrate nic neudělá a data nám nesmaže.

Toť vše. Váš projekt by měl být připraven k provádění dalších změn pouze pomocí migrací.

Komentáře

K tomuto postu je 0 komentářů. Přidej vlastní →

Přidej komentář

Povinná pole jsou vyznačena tučně.