Tomáš Holý
26.2.2014

Flyway



Pravděpodobně jste již někdy řešili otázku verzování datového modelu na některém z vašich projektů. Možná jste použili nejjednodušší řešení, a to psaní alter skriptů, které pak ručně spouští při nasazováním nového releasu. Možná jste tak, jako my, udělali chybu. Zapomněli jeden z alter skriptů spustit, případně jej nevyzkoušeli na testovací instanci. A problém byl na světě. Flywayflyway   V takové chvíli jste si třeba řekli A DOST! My jsme si to řekli a chtěli celý proces zautomatizovat, tj. odstranit lidský faktor z procesu, protože jak se říká: „Kdo nic nedělá, nic nezkazí.“ Jak to ale udělat a jaký nástroj zvolit? Jedním z nejrozšířenějších databázových migračních nástrojů je Liquibase. Jeho výběrem chybu určitě neuděláte. Pojďme se ale podívat na jednoho jeho zajímavého konkurenta – Flyway. Jeho hlavní devizou je jednoduchost a to jak samotného principu, tak jeho použití v projektu. Migrace databáze pomocí Flyway probíhá v těchto krocích:

  • Inicializace databáze – Vytvoří se systémová tabulka SCHEMA_VERSION, která uchovává informace o stavu databáze a o její verzi. Provádí se pouze pokud je to třeba.
  • Nalezení nových migrací  – Skenuje se classpath (nebo uvedené lokace) a hledají se nové SQL nebo Java migrace (soubory uložené na filesystemu), které se seřadí podle jejich čísla verze, která je uvedená v názvu souboru (nové jsou ty, jejichž verze je vetší než je poslední verze uložená v databázi).
  • Spuštění nalezených migrací – Migrace jsou spouštěny v daném pořadí a informace o jejich provedení se ukládají do tabulky SCHEMA_VERSION. Každá migrace (jeden soubor) beží ve vlastní transakci. Pokud některá migrace skončí chybou, další v pořadí se již neprovádí.

schema_version_table

schema_version_example

Toto řešení je jednoduché a přitom dostatečně flexibilní, aby to pokrylo většinu výše zmíněných problémů. Stačí připravit migrační skripty a po startu aplikace inicializovat objekt Flyway, který se již postará o zajištění aktuálnosti databáze.

Konfigurace Java

Flyway flyway = new Flyway();
flyway.setDataSource(url, user, password); flyway.migrate();
 

Konfigurace Spring

<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
  <property name="dataSource" ref="..."/>
  <property name="locations">... </property>
</bean>
<!-- Must be run after Flyway to ensure the database is compatible with the code -->
<bean id="entityManagerFactory" class="..." depends-on="flyway"> ... </bean>
 

V jakých případech byste měli uvažovat o využití Flyway a kdy se mu raději vyhnout, je shrnuto v nasledujících bodech. Měl bych o něm uvažovat:

  • K aktualizaci datábáze využívám SQL skripty, mám je pod kontrolou
  • Při migraci pracuji s binárnímy daty
  • Potřebuji provádět složitější migrace přes business logiku (skripty)

Raději se mu vyhnu:

  • Podporuji multidatabázového prostředí (SQL skripty je nutné psát pro každou databázi zvlášť)
  • Požaduji u jednotlivých migrací podporu rollback
  • Využívám databáze, kterou Flyway nepodporuje
 

Pokud řešíte verzování datového modelu stále ručně a přemýšlíte o změně, Flyway by určitě neměl chybět ve vašem hledáčku. Ačkoliv se nehodí na všechny druhy projektů, o to se ovšem ani nesnaží, tak díky jeho jednoduchosti, snadné použitelnosti a dobré dokumentaci určitě stojí za Vaši pozornost. Jak řešíte verzování datového modelu na projektech Vy? Vaše názory uvítám v komentářích.

Flyway

Vaše emailová adresa nebude zveřejněna

Komentáře

Děkujeme za váš komentář
Další
  • Flyway podporuje rollback u migrací v default konfiguraci.

  • Tomáš Holý

    Pokud se budeme bavit o rollbacku transakcí jednoltivých migrací, tak ty Flyway samozřejmě podporuje. Pokud ale chceme provést rollback několika již provedených migrací, tak tady už nám Flyway pomocnou ruku nepodá. V tomhle případě by se jednalo o migrace směrem dolů, více o tomto problému nalezenete v FAQ zde http://flywaydb.org/documentation/faq.html#downgrade.

  • Filip Jirsák

    To, že migrace běží ve vlastní transakci, je podle mne zavádějící. DDL operace, které většinou budou hlavní částí migrace, se často provádí v samostatné transakci. Podporu pro transakční DDL má PostgreSQL, tam je možné odrolovat celou transakci i s DDL operacemi. Ale třeba MySQL to neumí a každá DDL operace se provede okamžitě. Oracle nebo MS-SQL mají prý pro transakční DDL nějakou podporu, ale v základním provedení se také operace provedou ihned.

  • Tomáš Holý

    Díky za postřeh Filipe, s DDL operacemi to samožřejmně tak moc jednoduché. Ale to spíše záleží na databázi, kterou použijete.Flyway funguje pořád stejně. My osobně se snažíme držet toho, že jedna migrace (soubor) by neměl obsahovat jak DDL operace, tak operace s daty. Tím částečně odbouráváme riziko případného problému. Ale v praxi jsme na žádný takový problém zatím nenarazilii. Máme testovací prostředí shodné s produkcí a zásahy do databáze smí dělat pouze Flyway, aby nedošlo k nekonzistenci.