Рубрики
Без рубрики

Миграции схемы базы данных Flyway

Узнайте, как работает Flyway и как его можно использовать для выполнения автоматической миграции схем баз данных с использованием сценариев инкрементной миграции SQL.

Автор оригинала: Vlad Mihalcea.

Вступление

В этой статье я собираюсь объяснить, как Flyway работает и как вы можете использовать его для запуска автоматической миграции схемы базы данных с использованием сценариев инкрементной миграции SQL.

Flyway -это проект с открытым исходным кодом, созданный Акселем Фонтейном и позже приобретенный Red Gate . Миграции баз данных могут быть определены либо как сценарии SQL, либо как классы на основе JDBC.

Сценарии переноса схемы базы данных

Как и исходный код приложения, схема базы данных меняется со временем. Чтобы перенести схему базы данных из одной версии в другую, вам необходимо запустить сценарии DDL.

Например, мы могли бы хранить сценарии миграции DDL в папке src/main/|, как это:

> tree src/main/resources

├── flyway
│   └── scripts
│       ├── postgresql
│           ├── migration
│           │   ├── V1_0__post_tag.sql
│           │   ├── V1_1__post_details.sql
│           │   └── V1_2__post_comment.sql

Папка миграция содержит три сценария инкрементной миграции, которые соответствуют соглашениям об именах файлов сценариев Flyway. Двойное подчеркивание (например, __ ) отделяет версию сценария от имени сценария.

Файл V1_0__post_tag.sql является исходным сценарием миграции и содержит следующие инструкции DDL:

CREATE SEQUENCE hibernate_sequence
START 1 INCREMENT 1;

CREATE TABLE post (
    id int8 NOT NULL,
    title varchar(255),
    PRIMARY KEY (id)
);

CREATE TABLE tag (
    id int8 NOT NULL,
    name varchar(255),
    PRIMARY KEY (id)
);

CREATE TABLE post_tag (
    post_id int8 NOT NULL,
    tag_id int8 NOT NULL,
    PRIMARY KEY (post_id, tag_id)
);

ALTER TABLE post_tag
ADD CONSTRAINT POST_TAG_TAG_ID_FK
FOREIGN KEY (tag_id) REFERENCES tag;

ALTER TABLE post_tag
ADD CONSTRAINT POST_TAG_POST_ID_FK
FOREIGN KEY (post_id) REFERENCES post;

Файл V1_1__post_details.sql является вторым сценарием миграции, и он создает post_details таблица:

CREATE TABLE post_details (
    id int8 NOT NULL,
    created_by varchar(255),
    created_on TIMESTAMP,
    PRIMARY KEY (id)
);

ALTER TABLE post_details
ADD CONSTRAINT POST_DETAILS_POST_ID_FK
FOREIGN KEY (id) REFERENCES post;

Файл V1_2__post_comment.sql является третьим сценарием миграции, и он отвечает за создание таблицы post_comment :

CREATE TABLE post_comment (
    id int8 NOT NULL,
    review varchar(255),
    post_id int8, PRIMARY KEY (id)
);

ALTER TABLE post_comment
ADD CONSTRAINT POST_COMMENT_POST_ID_FK
FOREIGN KEY (post_id) REFERENCES post;

Конфигурация взлетно-посадочной полосы

Взлетно-посадочная полоса очень проста в настройке. Все, что вам нужно сделать, это создать экземпляр org.flywaydb.core. Flyway класс и установите JDBC Источник данных и расположение сценариев переноса базы данных.

Если вы используете Spring Framework, вы можете использовать следующую конфигурацию на основе Java:

@Bean
public Flyway flyway() {
    Flyway flyway = Flyway.configure()
        .dataSource(dataSource())
        .baselineOnMigrate(true)
        .locations(
            String.format(
                "classpath:/flyway/scripts/%1$s/migration",
                databaseType.name().toLowerCase()
            )
    ).load();
    flyway.migrate();
    return flyway;
}

И нам также необходимо убедиться, что JPA EntityManagerFactory создан после того, как компонент Flyway применит миграции схемы базы данных:

@Bean 
@DependsOn("flyway")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    ...
}

Если вы используете Spring Boot, вы можете настроить Flyway декларативно, не создавая org.flywaydb.core. Взлетно-посадочная полоса Объект. Ознакомьтесь со справочной документацией для получения более подробной информации.

Запуск миграции схемы базы данных Flyway

При загрузке контекста приложения Spring в пустой схеме базы данных мы можем видеть в журналах, что Flyway применяет все существующие сценарии инкрементной миграции:

INFO  : Flyway Community Edition 6.4.4 by Redgate

DEBUG : Scanning for classpath resources at 
        'classpath:flyway/scripts/postgresql/migration' ...
DEBUG : Found resource: 
        flyway/scripts/postgresql/migration/V1_0__post_tag.sql
DEBUG : Found resource: 
        flyway/scripts/postgresql/migration/V1_1__post_details.sql
DEBUG : Found resource: 
        flyway/scripts/postgresql/migration/V1_2__post_comment.sql

INFO  : Current version of schema "public": << Empty Schema >>

DEBUG : Parsing V1_0__post_tag.sql ...
DEBUG : Starting migration of schema "public" 
        to version 1.0 - post tag ...
DEBUG : Successfully completed migration of schema "public" 
        to version 1.0 - post tag
DEBUG : Schema History table "public"."flyway_schema_history" 
        successfully updated to reflect changes

DEBUG : Parsing V1_1__post_details.sql ...
DEBUG : Starting migration of schema "public" 
        to version 1.1 - post details ...
DEBUG : Successfully completed migration of schema "public" 
        to version 1.1 - post details
DEBUG : Schema History table "public"."flyway_schema_history" 
        successfully updated to reflect changes

DEBUG : Parsing V1_2__post_comment.sql ...
DEBUG : Starting migration of schema "public" 
        to version 1.2 - post comment ...
DEBUG : Successfully completed migration of schema "public" 
        to version 1.2 - post comment
DEBUG : Schema History table "public"."flyway_schema_history" 
        successfully updated to reflect changes

INFO  : Successfully applied 3 migrations to schema "public" 
        (execution time 00:00.146s)

Как мы видим в журнале, сценарии переноса базы данных были успешно выполнены Flyway, и, если мы проверим схему базы данных, мы увидим, что она выглядит следующим образом:

Мы можем идентифицировать сообщение , тег , post_tag , post_details , и post_comment таблицы, созданные путем запуска трех сценариев миграции.

Единственная таблица , которая не была включена в сценарии миграции, – это flyway_schema_history , которая создается Flyway при первом запуске. Целью таблицы flyway_schema_history является хранение истории миграции схемы базы данных, и в нашем случае она выглядит следующим образом:

| installed_rank | version | description  | type | script                 | checksum   | installed_by | installed_on   | execution_time | success |
|----------------|---------|--------------|------|------------------------|------------|--------------|----------------|----------------|---------|
| 1              | 1       | post tag     | SQL  | V1_0__post_tag.sql     | -611721954 | postgres     | 30-06-20 15:21 | 61             | TRUE    |
| 2              | 1.1     | post details | SQL  | V1_1__post_details.sql | 511495203  | postgres     | 30-06-20 15:21 | 13             | TRUE    |
| 3              | 1.2     | post comment | SQL  | V1_2__post_comment.sql | 762350400  | postgres     | 30-06-20 15:21 | 14             | TRUE    |

Таблица flyway_schema_history используется Flyway для определения последней версии, которая была успешно применена, поэтому при новом выполнении будут выполняться только более новые сценарии миграции.

Запуск нового сценария переноса схемы базы данных Flyway

Теперь давайте предположим, что мы реализуем новую функцию приложения, которая требует добавления новой таблицы базы данных под названием пользователи . Для этого нам нужно создать новый сценарий миграции с версией, которая больше, чем у любого из ранее выполненных сценариев миграции.

Итак, нам нужно создать новый сценарий миграции, называемый Итак, нам нужно создать новый сценарий миграции, называемый , в той же папке src/main/ресурсы/flyway/скрипты/postgresql/миграция

Сценарий V1_3__users.sql содержит следующие инструкции DDL:

CREATE TABLE users (
    id bigint NOT NULL,
    name varchar(255),
    PRIMARY KEY (id)
);

При перезапуске приложения Spring Flyway обнаружит новый V1_3__users.sql сценарий миграции и запустит его, как показано в журналах:

INFO  : Current version of schema "public": 1.2

DEBUG : Parsing V1_3__users.sql ...
DEBUG : Starting migration of schema "public" 
        to version 1.3 - users ...
DEBUG : Successfully completed migration of schema "public" 
        to version 1.3 - users
DEBUG : Schema History table "public"."flyway_schema_history" 
        successfully updated to reflect changes
        
INFO  : Successfully applied 1 migration to schema "public" 
        (execution time 00:00.064s)

Если мы проверим схему базы данных, мы увидим, что она содержит вновь созданные пользователи таблицы:

И, если мы проверим таблицу flyway_schema_history , мы увидим, что сценарий V1_3__users.sql был успешно применен:

| installed_rank | version | description  | type | script                 | checksum   | installed_by | installed_on   | execution_time | success |
|----------------|---------|--------------|------|------------------------|------------|--------------|----------------|----------------|---------|
| 1              | 1       | post tag     | SQL  | V1_0__post_tag.sql     | -611721954 | postgres     | 30-06-20 15:21 | 61             | TRUE    |
| 2              | 1.1     | post details | SQL  | V1_1__post_details.sql | 511495203  | postgres     | 30-06-20 15:21 | 13             | TRUE    |
| 3              | 1.2     | post comment | SQL  | V1_2__post_comment.sql | 762350400  | postgres     | 30-06-20 15:21 | 14             | TRUE    |
| 4              | 1.3     | users        | SQL  | V1_3__users.sql        | -596399497 | postgres     | 30-06-20 15:55 | 32             | TRUE    |

Потрясающе, правда?

Вывод

Сценарии инкрементной миграции-лучший способ зафиксировать изменения, внесенные в данную схему базы данных, и точно так же, как вы храните исходный код приложения в VCS (Система управления версиями). (например, git), сценарии миграции схемы также должны находиться в VCS. Таким образом, если вам интересно, когда произошло изменение данной схемы, вы можете найти информацию, просмотрев журнал фиксации.

Что хорошо в инструментах автоматической миграции схем, таких как Flyway, так это то, что миграции могут быть проверены в средах контроля качества (обеспечения качества), поэтому при развертывании в рабочей среде мы знаем, что сценарии миграции будут успешно выполнены. Без средства автоматической миграции схемы базы данных было бы невозможно автоматически развернуть серверы контроля качества или производственные серверы.

В целом, вам никогда не следует запускать сценарии миграции вручную. Действия, выполняемые вручную, подвержены человеческим ошибкам, поэтому лучше иметь инструмент, который автоматически запускает сценарии миграции при обновлении данной системы.