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.
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
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
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
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);
Typy migracji – wersjonowane vs powtarzalne
Typ | Prefix | Kiedy używać | Przykład |
---|---|---|---|
Wersjonowane | V | Zmiany strukturalne | V1__Create_table.sql |
Powtarzalne | R | Widoki, procedury | R__User_report_view.sql |
Cofające | U | Rollback (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;
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
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:
Rozwiązanie:
- Napraw błąd w pliku migracji
- Usuń wpis FAILED z flyway_schema_history
- Uruchom ponownie migrację
-- Usuń błędną migrację z historii DELETE FROM flyway_schema_history WHERE success = 0;
Best practices dla zespołu
• 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ść
W wersji community nie ma automatycznego rollback. Musisz stworzyć nową migrację która cofa zmiany. Wersja Pro/Enterprise ma funkcję undo migrations.
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.
Tak. Obsługuje MySQL, PostgreSQL, Oracle, SQL Server, H2, SQLite i wiele innych. Ten sam kod działa z różnymi bazami.
Utwórz osobny katalog db/testdata i używaj profili Spring (@Profile(„dev”)) aby ładować dane tylko w środowisku deweloperskim.
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:
- Oficjalna dokumentacja Flyway
- Flyway Maven Plugin
- Flyway na GitHub
- Spring Boot 1.4 i integracja z Flyway
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!