Flyway

 data-srcset

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

flyway

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 Zpět

Posuňte s námi své služby dál.

Nasměrujeme vás správným směrem!

Kontakujte nás