Database migration – fast and easy with Flyway and Spring Boot

Migracja jest wręcz niezbędna. To dzięki niej mamy pewność że schemat naszej bazy danych na produkcji jest aktualny. Ułatwia współpracę zespołów developerskich, pozwala łatwo wersjonować strukturę.

Obecnie do dyspozycji mamy wiele rozwiązań, bardzo dużo z nich jest cross platformowych, nie jest dedykowana pod konkretną technologię oraz wspiera wiele współczesnych silników bazodanowych. Pliki migracyjne mogą być w wielu różnych formatach. W rozwiązaniach obsługujących równocześnie kilka różnych baz danych wciąż popularna jest konfiguracja za pomocą XML’a (m.in. LiquiBase). Mimo większej czasochłonności podczas ich przygotowywania niż w przypadku skryptów migracyjnych  napisanych w sql, często bywa to przewagą nad innymi rozwiązaniami. Dlaczego ? W takim podejściu narzędzie migracyjne generuje skrypty sql specyficzne dla wybranej, używanej bazy danych. Podczas gdy pisząc je samodzielnie musielibyśmy przygotować N wersji tego samego skryptu dla różnych silników.Rozwiązaniem które mimo nie wspierania konfiguracji za pomocą XML’a zyskuje na popularności jest Flyway. Pozwala on na migrację bazy za pomocą narzędzia konsolowego, poprzez API lub pluginy do Mavena, SBT itp.

I co najważniejsze pozwala zrobić to naprawdę szybko i łatwo !

Tworząc aplikację z wykorzystaniem Spring Boota oczywiście mamy dostarczoną gotową konfigurację przez twórców frameworka i jedyne co pozostaje do zrobienia to dodanie zależności do projektu:

oraz ustawienie w application.properties:

I już możemy dodawać skrypty migracyjne do podanego katalogu. Nie musimy definiować połączenia do bazy, użytkownika, hasła, drivera – wszystko to jest brane by default z ustawień domyślnego datasource’a.

Jednak należy pamiętać o odpowiednim nazewnictwie dla plików.

Łatwo tutaj zauważyć pewien wzorzec w nazewnictwie, wszystkie pliki muszą rozpoczynać się od V, następnie podajemy wersję która zostanie zapisana w bazie w specjalnej tabeli(schema_version) wygenerowanej przez flyway’a aby kontrolować wykonywanie skryptów. Definiując wersję możemy posługiwać się podkreśleniem lub kropką jako separatorem oraz musimy pamiętać o zdefiniowaniu co najmniej jednej sekcji numerycznej.  Możemy pomijać kolejne wersje w numeracji jeśli jest taka potrzeba, ale warto pamiętać że Flyway nie uruchomi skryptu z mniejszym indeksem niż ten który został wykonany podczas ostatniej migracji, dodatkowo należy spodziewać się odpowiedniego komunikatu od narzędzia w momencie uruchomienia takiej migracji:

Domyślnie podczas każdego uruchomienia aplikacji Springowej, Flyway sprawdza czy w katalogu roboczym nie ma nowych, jeszcze nie wykonywanych plików i jeśli takie znajdzie uruchamia migrację:

Dodatkową i wartą do wspomnienia opcją są powtarzalne migracje dla których używamy nazewnictwa bez definiowania wersji oraz nazwę zawsze  rozpoczynamy od R:

Są one idealne do widoków, procedur itp, dzięki czemu łatwiej śledzić zmiany w repozytorium. Migracje te są zawsze uruchamiane po zakończeniu wykonywania migracji posiadających wersję, ale dzieję się to tylko wtedy gdy zmienia się checksum’a skryptu przechowywana w tabeli schema_version.

 

Podsumowując, jeśli zaczynasz nowy projekt i nie wiesz jeszcze czego użyć rozważ Flyway 🙂

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *