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ě.

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í.
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.
