Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Что такое Flyway
Flyway это open-source инструмент для управления версионированием схемы базы данных (Database Migration Tool).
Основное назначение
Flyway автоматизирует и контролирует изменения структуры БД через простые SQL скрипты или Java код. Это гарантирует:
- Воспроизводимость изменений
- Синхронизацию схемы между окружениями
- История всех изменений
- Откат к предыдущему состоянию
- Командную разработку без конфликтов
Как Flyway работает
- Flyway сканирует директорию с миграциями (
db/migration) - Проверяет какие миграции уже были применены (таблица
flyway_schema_history) - Применяет только новые миграции в порядке версионирования
- Логирует каждый успешный или неудачный запуск
Структура миграций
Имя файла следует стандарту: V{version}__{description}.sql
db/migration/
├── V1__Create_users_table.sql
├── V2__Add_email_column.sql
├── V3__Create_orders_table.sql
├── V4__Add_foreign_key.sql
└── V5__Create_indexes.sql
Примеры версионирования:
- V1__, V2__, V3__ - базовое версионирование
- V1.1__, V1.2__, V2.0__ - семантическое версионирование
- V2024.01__, V2024.02__ - датированное версионирование
Пример использования
Зависимость в pom.xml
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>10.0.1</version>
</dependency>
Конфигурация в application.yml
spring:
flyway:
enabled: true
locations: classpath:db/migration
baselineOnMigrate: false
table: flyway_schema_history
validateOnMigrate: true
datasource:
url: jdbc:postgresql://localhost:5432/myapp
username: postgres
password: password
Примеры SQL миграций
V1__Create_users_table.sql
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
V2__Add_phone_column.sql
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
CREATE INDEX idx_users_email ON users(email);
V3__Create_orders_table.sql
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
amount DECIMAL(10, 2),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Запуск из Java кода
Flyway flyway = Flyway.configure()
.dataSource(url, user, password)
.locations("db/migration")
.load();
MigrationInfo[] migrations = flyway.info().all();
flyway.migrate(); // Применить миграции
Сравнение с Alembic, Goose, Liquibase
| Инструмент | Язык | Синтаксис | Сложность | Использование |
|---|---|---|---|---|
| Flyway | Java | SQL + Java | Простой | Spring Boot |
| Liquibase | Java | XML + SQL | Средняя | Spring, Quarkus |
| Alembic | Python | Python | Средняя | SQLAlchemy |
| Goose | Go | SQL | Простой | Go приложения |
Таблица history
Flyway автоматически создаёт таблицу flyway_schema_history:
SELECT * FROM flyway_schema_history;
-- Результат:
installedRank | version | description | type | script | checksum | installedBy | installedOn | executionTime | success
1 | 1 | Create users table | SQL | V1__Create_users_table.sql | 123456 | postgres | 2024-01-15 | 145 | true
2 | 2 | Add phone column | SQL | V2__Add_phone_column.sql | 789012 | postgres | 2024-01-16 | 89 | true
Использование в командной разработке
Сценарий 1: Параллельная разработка
Двоим разработчикам нужны разные изменения БД:
Дев 1: V3__Create_payment_table.sql
Дев 2: V4__Add_status_column.sql
Чтобы избежать конфликтов версий, используем датирование:
Dev 1: V2024.01.15.001__Create_payment_table.sql
Dev 2: V2024.01.15.002__Add_status_column.sql
Сценарий 2: Откат
Отката вперёд в Flyway нет (по дизайну).
Чтобы отменить миграцию, пишешь новую:
V1__Create_table.sql -- Создание
V2__Drop_table.sql -- Удаление (откат)
V3__Recreate_table.sql -- Пересоздание
Лучшие практики
✅ Делай миграции маленькими - одна миграция на одно логическое изменение
✅ Пиши идемпотентные скрипты - они должны быть безопасны при повторном запуске
✅ Используй версионирование - не меняй старые V1__, V2__ файлы
✅ Документируй большие изменения - комментируй сложную логику
✅ Тестируй миграции - убедись, что они работают на разных версиях БД
✅ Не смешивай данные и схему - отделяй INSERT/UPDATE от CREATE/ALTER
❌ Не редактируй применённые миграции - это нарушит историю
❌ Не используй откаты - используй новые миграции для отмены
Интеграция со Spring Boot
Spring Boot автоматически запускает Flyway при старте приложения:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
// Flyway миграции применятся автоматически
}
}
Проверка статуса миграций
@RestController
@RequestMapping("/api/migrations")
public class MigrationController {
@Autowired
private Flyway flyway;
@GetMapping("/status")
public ResponseEntity<?> getMigrationStatus() {
MigrationInfo[] migrations = flyway.info().all();
return ResponseEntity.ok(migrations);
}
}
Flyway критичный инструмент в современной Java разработке, обеспечивающий надёжное управление схемой БД в любом размере проекта.