Автор оригинала: 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, так это то, что миграции могут быть проверены в средах контроля качества (обеспечения качества), поэтому при развертывании в рабочей среде мы знаем, что сценарии миграции будут успешно выполнены. Без средства автоматической миграции схемы базы данных было бы невозможно автоматически развернуть серверы контроля качества или производственные серверы.
В целом, вам никогда не следует запускать сценарии миграции вручную. Действия, выполняемые вручную, подвержены человеческим ошибкам, поэтому лучше иметь инструмент, который автоматически запускает сценарии миграции при обновлении данной системы.