Liquebase/Flyway - решает задачу перехода от одной версии БД к другой
Занятие OTUS (liquibase/flyway): тык
Миграции:
- хранят изменения, которые необходимо применить к БД в специальных файлах
- часто такие файлы называются
changelog
, а само изменение -changeset
- каждая система миграции умеет отличать один changeset от другого
- и не будет применять к системе changeset, примененный ранее
в src - schema.sql и data.sql
в test - только data.sql, чтобы структура соответствовала сорсу
Особенности Liquebase
:
● Поддерживает changelog-и в форматах
xml/yaml/json/sql
● По умолчанию changelog-и ищутся в
“resources/db/changelog”
● Каждый changeset имеет свой id и контрольную
сумму
● Файлы changelog-ов можно
объединять/включать в один (include*), то
позволяет создать достаточно ветвистую
структуру каталогов
● Умеет откатывать changelog-и
● В SpringBoot срабатывает на старте приложения
если spring.liquibase.enabled=true
старые версии java-приложений должны уметь работать с новыми версиями БД
Именование changelog-ов
YYYY-MM-DD--description.yml
Пример:
20200-06-10--Create-persons_table.yml
- Дата внесения изменений в формате YYYY-MM-DD
- Разделитель: два минуса
- Описание: слова разделяются '-' минусом
- Суффикс: расширение файла (.xml/.yml/.json/.sql)
Сами changelog-и лучше складывать в папки с именем-номером версии структуры БД, к которой они относятся
Пример chengelog-ов: тык
Зависимость
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>${liquibase.version}</version>
</dependency>
<!--иногда может понадобится-->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version>
</dependency>
Пример yml changeset-a с созданием таблиц
:
databaseChangeLog:
- changeSet:
id: create_tables
author: your_name
changes:
- createTable:
tableName: users
columns:
- column:
name: id
type: INT
constraints:
primaryKey: true
nullable: false
- column:
name: username
type: VARCHAR
length: 50
- column:
name: email
type: VARCHAR
length: 100
- createTable:
tableName: orders
columns:
- column:
name: order_id
type: INT
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: INT
constraints:
foreignKeyName: fk_orders_user_id
references: users(id)
- column:
name: order_date
type: DATE
Пример yml changeset-а с изменением существующей таблицы
:
databaseChangeLog:
- changeSet:
id: 2019-01-12--0001--user
author: stvort
addColumn:
tableName: users
columns:
- column:
name: full_name
type: varchar(255)
constraints:
nullable: false
Пример yml наполнения ТЕСТОВЫМИ данными
(resources/data):
changeset считается либо до конца файла, либо до нового --changeset комментария
Пример sql changeset-a с созданием таблиц
(вставка данных ровно также):
--liquibase formatted sql
--changeset timofeev_vadim:2024-07-11-init
create table if not exists authors (
id bigserial,
full_name varchar(255),
primary key (id)
);
Пример db/changelog/db.changelog-master.yaml
:
databaseChangeLog:
- includeAll:
path: db/changelog/1.0/
- includeAll:
path: db/changelog/data/
Поднять тестовый конфиг
для H2:
spring:
datasource:
url: jdbc:h2:mem:testdb
liquibase:
change-log: classpath:db/changelog/db.changelog-master-test.yaml