Flyway – migracje bazy danych

Flyway automatyzuje migracje bazy danych poprzez wersjonowane skrypty SQL. Zapewnia kontrolę wersji schematu, rollback i bezpieczne wdrożenia. Działa z Maven, Gradle i Spring Boot. Jeden plik SQL = jedna migracja.

Dlaczego migracje bazy danych to kluczowy element każdego projektu

Każdy programista zna ten problem – zmiany w bazie danych to prawdziwy koszmar podczas wdrożeń. Jeden brakujący ALTER TABLE i cała aplikacja przestaje działać. Różne środowiska mają różne wersje schematu, a rollback zmian w bazie to misja prawie niemożliwa. Flyway rozwiązuje te problemy raz na zawsze.

Flyway to open-source narzędzie do migracji bazy danych które traktuje zmiany w schemacie jak kod – z kontrolą wersji, historią i możliwością cofnięcia zmian.

Co się nauczysz:

  • Jak skonfigurować Flyway w Maven i Spring Boot
  • Konwencje nazewnictwa plików migracji
  • Różnice między migracji wersjonowanymi a powtarzalnymi
  • Jak obsługiwać rollbacki i naprawiać błędne migracje
  • Best practices dla zespołowego developmentu
Wymagania wstępne: Podstawy SQL, znajomość Maven/Gradle, podstawy Spring Boot

Konfiguracja Flyway – pierwsze kroki

Dodanie Flyway do projektu Maven to jedna linia:


    org.flywaydb
    flyway-core
    4.2.0

Dla Spring Boot wystarczy starter:


    org.springframework.boot
    spring-boot-starter-jdbc
Pro tip: Spring Boot 1.5 automatycznie wykrywa Flyway na classpath i uruchamia migracje przy starcie aplikacji.

Struktura katalogów i konwencje nazewnictwa

Flyway szuka migracji w standardowym katalogu:

src/main/resources/db/migration/
├── V1__Create_user_table.sql
├── V2__Add_email_column.sql
├── V3__Create_order_table.sql
└── R__View_user_statistics.sql
Konwencja nazewnictwa: V{VERSION}__{DESCRIPTION}.sql – wersja musi być unikalna, opis oddzielony podwójnym podkreśleniem.

Pierwsza migracja – tworzenie tabeli użytkowników:

-- V1__Create_user_table.sql
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_username ON users(username);
Uwaga: Nigdy nie modyfikuj już wykonanej migracji! Flyway sprawdza checksum plików i wykryje każdą zmianę.

Typy migracji – wersjonowane vs powtarzalne

TypPrefixKiedy używaćPrzykład
WersjonowaneVZmiany strukturalneV1__Create_table.sql
PowtarzalneRWidoki, proceduryR__User_report_view.sql
CofająceURollback (płatna wersja)U1__Drop_column.sql

Migracja powtarzalna – widok który może się zmieniać:

-- R__User_statistics_view.sql
CREATE OR REPLACE VIEW user_statistics AS
SELECT 
    DATE(created_at) as registration_date,
    COUNT(*) as users_count
FROM users 
GROUP BY DATE(created_at)
ORDER BY registration_date;
Migracje wersjonowane to jak commity w Git – wykonują się raz i już. Migracje powtarzalne to jak build script – mogą być uruchamiane wielokrotnie.

Konfiguracja w application.properties

Spring Boot pozwala na dostosowanie Flyway:

# application.properties
spring.flyway.locations=classpath:db/migration
spring.flyway.baseline-on-migrate=true
spring.flyway.validate-on-migrate=true
spring.flyway.clean-disabled=true
Pułapka: clean-disabled=true zapobiega przypadkowemu usunięciu całej bazy danych komendą flyway:clean.

Flyway w akcji – pierwsze migracje

Po dodaniu pierwszej migracji i uruchomieniu aplikacji Spring Boot:

2017-11-20 10:15:32.123  INFO --- Flyway: Validating migrations...
2017-11-20 10:15:32.156  INFO --- Flyway: Creating schema history table: "flyway_schema_history"
2017-11-20 10:15:32.198  INFO --- Flyway: Current version of schema "testdb": << Empty Schema >>
2017-11-20 10:15:32.201  INFO --- Flyway: Migrating schema "testdb" to version 1 - Create user table
2017-11-20 10:15:32.234  INFO --- Flyway: Successfully applied 1 migration to schema "testdb"

Flyway automatycznie tworzy tabelę flyway_schema_history która śledzi wykonane migracje:

SELECT * FROM flyway_schema_history;

installed_rank | version | description        | type | script                 | checksum   | installed_on
1              | 1       | Create user table  | SQL  | V1__Create_user_table  | 1234567890 | 2017-11-20

Obsługa błędów i naprawianie migracji

Co jeśli migracja zawiera błąd SQL? Flyway oznacza ją jako FAILED:

Typowy błąd: migracja z błędem składni SQL zatrzymuje cały process wdrożenia aplikacji.

Rozwiązanie:

  1. Napraw błąd w pliku migracji
  2. Usuń wpis FAILED z flyway_schema_history
  3. Uruchom ponownie migrację
-- Usuń błędną migrację z historii
DELETE FROM flyway_schema_history WHERE success = 0;
Pro tip: W środowisku produkcyjnym zawsze testuj migracje najpierw na kopii danych!

Best practices dla zespołu

Złote zasady Flyway:

• Nigdy nie modyfikuj już wykonanej migracji

• Zawsze testuj migracje na wszystkich środowiskach

• Używaj opisowych nazw plików

• Trzymaj migracje w repozytorium razem z kodem

Maven plugin dla zaawansowanych operacji

Plugin Maven daje dodatkowe możliwości:


    org.flywaydb
    flyway-maven-plugin
    4.2.0
    
        jdbc:mysql://localhost:3306/testdb
        root
        password
    

Przydatne komendy Maven:

mvn flyway:info     # Pokaż status migracji
mvn flyway:migrate  # Wykonaj migracje
mvn flyway:validate # Sprawdź spójność
Czy mogę cofnąć migrację w Flyway?

W wersji community nie ma automatycznego rollback. Musisz stworzyć nową migrację która cofa zmiany. Wersja Pro/Enterprise ma funkcję undo migrations.

Co jeśli dwóch programistów stworzy migrację z tym samym numerem?

Flyway wykryje konflikt i zgłosi błąd. Jeden z programistów musi zmienić numer wersji. Używaj timestampów (np. V20171120001) aby unikać konfliktów.

Czy Flyway działa z różnymi bazami danych?

Tak. Obsługuje MySQL, PostgreSQL, Oracle, SQL Server, H2, SQLite i wiele innych. Ten sam kod działa z różnymi bazami.

Jak obsłużyć dane testowe w migracjach?

Utwórz osobny katalog db/testdata i używaj profili Spring (@Profile(„dev”)) aby ładować dane tylko w środowisku deweloperskim.

Czy mogę używać Flyway bez Spring Boot?

Oczywiście! Flyway to niezależna biblioteka. Możesz używać z czystą Javą, Maven pluginem lub narzędziem linii komend.

🚀 Zadanie dla Ciebie

Stwórz projekt Spring Boot z Flyway. Utwórz 3 migracje: 1) tabela produktów, 2) tabela kategorii, 3) dodanie klucza obcego category_id do produktów. Dodaj także migrację powtarzalną z widokiem pokazującym produkty z nazwami kategorii.

Przydatne zasoby:

Jak zarządzasz migracjami bazy danych w swoich projektach? Używasz Flyway, Liquibase, czy może robisz to ręcznie? Podziel się swoim doświadczeniem w komentarzach!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry