Простое руководство по началу работы с Flyway

задняя часть база данных

Введение

Flyway — это инструмент управления версиями базы данных с открытым исходным кодом, который предпочитает способ соглашения, а не конфигурацию. Flyway может управлять и отслеживать изменения базы данных независимо от приложения, поддерживает автоматическое обновление версии базы данных и имеет набор протоколов по умолчанию, не требующих сложной настройки Миграция может быть написана в виде сценариев SQL или в коде Java, а не только поддерживает командную строку и Java API также поддерживает инструменты сборки, Spring Boot и т. д. В то же время он может безопасно и надежно обновлять базу данных в распределенной среде, а также поддерживает восстановление после сбоя.

2. Краткое введение

# 2.1 Основные характеристики

普通 SQL:纯 SQL 脚本(包括占位符替换)没有专有的XML格式,没有锁定



无限制:使用 Java 代码来进行一些高级数据操作



零依赖:只需运行在 Java6(及以上)和数据库所需的 JDBC 驱动



约定优于配置:迁移时,自动查找系统文件和类路径中的 SQL 文件或 Java 类



高可靠性:在集群环境下进行数据库升级是安全可靠的



云支持:完全支持 Microsoft SQL Azure, Google Cloud SQL & App Engine、Heroku Postgres 和 Amazon RDS



自动迁移:使用 Flyway 提供的 API,让应用启动和迁移同时工作



快速失败:损坏的数据库或失败的迁移可以防止应用程序启动



数据库清理:在一个数据库中删除所有的表、视图、触发器,而不是删除数据库本身

# 2.2 Принцип работы

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

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

flyway_schema_historyСодержимое записей таблицы следующее:

installed_rank version description type script checksum installed_by installed_on execution_time success
1 1 Initial Setup SQL V1__Initial_Setup.sql 1996767037 axel 2016-02-04 22:23:00.0 546 true
2 2 First Changes SQL V2__First_Changes.sql 1279644856 axel 2016-02-06 09:18:00.0 127 true

Поскольку номер версии миграции записывается в таблицу flyway_schema_history, если номер версии файла меньше или равен номеру версии, отмеченному как текущая версия, они игнорируются и не выполняются.

Описанное выше содержание может быть недостаточно интуитивным для читателей, так что давайте приступим к собственно боевым упражнениям.

3. Настоящий бой

Тестовая среда: Mysql5.7

Создайте новый проект Maven.

# 3.1 Добавляем зависимости

<!-- flyway -->

<dependency>

    <groupId>org.flywaydb</groupId>

    <artifactId>flyway-core</artifactId>

    <version>5.2.4</version>

</dependency>



<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.15</version>

</dependency>

# 3.2 Настройка файла переноса данных

Создайте каталог db/migration в папке src/main/resources проекта и поместите в этот каталог файлы, требующие переноса данных.

Формат имени файла переноса данных: V__ .sql.

Примечание: Нейтрализация имени Между ними два подчеркивания!

Этот тест создает новый файл с именем V1__Create_person_table.sql со следующим содержимым:

create table PERSON (

    ID int not null,

    NAME varchar(100) not null

);

Содержание миграции данных версии 1 заключается в создании таблицы PERSON.

# 3.3 Кодирование

public class FlywayTest {



	public static void main(String[] args) {

		String url = "jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8";

		String user = "root";

		String password = "tiger";

		Flyway flyway = Flyway.configure().dataSource(url, user, password).load();

		

		// 创建 flyway_schema_history 表

//		flyway.baseline();

		 

		// 删除 flyway_schema_history 表中失败的记录

//		flyway.repair();

		

		// 检查 sql 文件

//		flyway.validate();

		

		// 执行数据迁移

		flyway.migrate();

		

		// 删除当前 schema 下所有表

//		flyway.clean();

	}

}

Результат выполнения следующий:

На рисунке созданный пролет базы данныхflyway_schema_historyТаблица и таблица PERSON, данные успешно перенесены в указанную базу данных.

Когда система обновляется и требуется миграция данных, нам нужно только поместить новую версию файла sql в каталог db/migration.

Например, мы создаем новый файл с именем V2__Add_people.sql со следующим содержимым:

insert into PERSON (ID, NAME) values (1, 'Axel');

insert into PERSON (ID, NAME) values (2, 'Mr. Foo');

insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

Содержимое переноса данных версии 2 заключается в вставке 3 фрагментов данных в таблицу PERSON.

Выполните приведенную выше программу еще раз, демонстрационный эффект выглядит следующим образом:

В-четвертых, интеграция Spring Boot

# 4.1 Добавляем зависимости

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>



<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

</dependency>



<dependency>

    <groupId>org.flywaydb</groupId>

    <artifactId>flyway-core</artifactId>

</dependency>

# 4.2 application.yml

spring:

  datasource:

    url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8

    username: root

    password: tiger 

  flyway:

    enabled: true

    # 禁止清理数据库表

    clean-disabled: true

    # 如果数据库不是空表,需要设置成 true,否则启动报错

    baseline-on-migrate: true

    # 与 baseline-on-migrate: true 搭配使用

    baseline-version: 0

    locations: 

      - classpath:db/migration/mysql(根据个人情况设置)

Поместите файл sql, который требует переноса данных, в каталог db/migration/mysql, запустите проект Spring Boot и запустите Flyway для переноса данных.

Результаты теста такие же, как и выше, и больше не публикуются здесь.

Меры предосторожности:

Если flyway не введен в начале проекта, а должен быть установлен, когда в базе данных уже есть таблицыbaseline-on-migrate: true, после установки стартового проекта конфигурации, flyway создаст в базе данныхflyway_schema_historytable, и в таблицу будет вставлена ​​запись таблицы с версией = 1. Если в данных миграции есть файл, начинающийся с V1__, файл сканирования проигнорирует файл и не выполнит миграцию, что может вызвать другие ошибки данных миграции.

Вышеуказанные два файла sql используются в качестве примеров для демонстрации.В библиотеке flyway есть тестовая таблица.Результаты запуска программы следующие:

Поскольку V1__Create_person_table.sql игнорируется, таблица PERSON не будет создана в библиотеке, и при миграции данных в файле V2__Add_people.sql неизбежно произойдет сбой.

Решение состоит в том, чтобы сначала удалитьflyway_schema_historyтаблице, а затем установить в файле конфигурацииbaseline-version: 0или измените имя версии файла переноса данных и, наконец, снова запустите приложение.

5. Ссылки

Официальный сайт FlyWay

Документация по весенней загрузке