Skip to content

Latest commit

 

History

History
163 lines (139 loc) · 5.2 KB

Миграция.md

File metadata and controls

163 lines (139 loc) · 5.2 KB

Liquebase

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

Пример 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):

SQL

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