← Назад к вопросам

Что такое Flyway?

2.0 Middle🔥 191 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Что такое Flyway

Flyway это open-source инструмент для управления версионированием схемы базы данных (Database Migration Tool).

Основное назначение

Flyway автоматизирует и контролирует изменения структуры БД через простые SQL скрипты или Java код. Это гарантирует:

  • Воспроизводимость изменений
  • Синхронизацию схемы между окружениями
  • История всех изменений
  • Откат к предыдущему состоянию
  • Командную разработку без конфликтов

Как Flyway работает

  1. Flyway сканирует директорию с миграциями (db/migration)
  2. Проверяет какие миграции уже были применены (таблица flyway_schema_history)
  3. Применяет только новые миграции в порядке версионирования
  4. Логирует каждый успешный или неудачный запуск

Структура миграций

Имя файла следует стандарту: 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

ИнструментЯзыкСинтаксисСложностьИспользование
FlywayJavaSQL + JavaПростойSpring Boot
LiquibaseJavaXML + SQLСредняяSpring, Quarkus
AlembicPythonPythonСредняяSQLAlchemy
GooseGoSQLПростой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 разработке, обеспечивающий надёжное управление схемой БД в любом размере проекта.

Что такое Flyway? | PrepBro