Backend
October 11, 2023

Liquibase для новичков: управление версиями схемы базы данных

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

Как ты понимаешь, со временем эта схема обязательно будет меняться. Могут добавляться новые таблицы или столбцы, что-то удаляться или переименовываться. А еще команда разработчиков обычно состоит из нескольких человек, которые могут одновременно вносить изменения в базу данных.

Чтобы все эти изменения не приводили к хаосу и краху проекта, нужно как-то их контролировать и управлять ими. И тут на помощь приходит управление версиями схемы базы данных.

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

Что такое Liquibase

Liquibase - это популярный open source инструмент для управления версиями схемы базы данных. Он работает с такими СУБД как MySQL, PostgreSQL, Oracle, SQL Server и другими.

Основная идея Liquibase в том, что он хранит список всех изменений в базе данных в специальных XML или YAML файлах. Каждое изменение описывается отдельно в виде changeset - "набора изменений".

Например, добавление новой таблицы users будет выглядеть примерно так:

<changeSet id="1" author="bob">
  CREATE TABLE users (
    id INT PRIMARY KEY, 
    name VARCHAR(50)
  );
</changeSet>

А изменение столбца name на username:

<changeSet id="2" author="bob">
  ALTER TABLE users
  RENAME COLUMN name TO username;
</changeSet>

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

Установка и настройка Liquibase

Чтобы начать работу с Liquibase, нужно его установить. Это довольно просто сделать через Maven или Gradle, если ты используешь Java. Или же просто скачать jar файл с официального сайта.

После установки нужно создать конфигурационный файл databaseChangeLog, где будут храниться все changeset для нашей базы данных.

Например, вот так выглядит базовый конфиг:

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
</databaseChangeLog>

Теперь мы готовы начать добавлять сюда наши changeset!

Основные функции Liquibase

Итак, давай разберемся с основными функциями Liquibase и как он позволяет управлять версиями базы данных.

Создание новой версии схемы

Чтобы создать новую версию схемы, достаточно добавить в конфиг файл нужный changeset. Например, вот так мы можем создать таблицу users:

<changeSet id="1" author="bob">
  CREATE TABLE users (
    id INT PRIMARY KEY,
    username VARCHAR(50)
  );
  
</changeSet>

Обновление схемы до определенной версии

Чтобы обновить базу данных до какой-то версии, используется команда update. Например,

liquibase update 5

применит все changeset до номера 5 включительно.

Откат изменений

Чтобы откатиться к более ранней версии схемы, можно воспользоваться командой

liquibase rollback count 3

Это откатит последние 3 changeset.

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

Пример использования Liquibase

Давай рассмотрим небольшой пример, как можно использовать Liquibase в реальном проекте.

Допустим, у нас есть приложение со следующей базой данных:

Таблица users:

  • id
  • username
  • created_at

Таблица posts:

  • id
  • user_id
  • text
  • created_at

Схема выглядит так:

<databaseChangeLog>

<changeSet id="1" author="bob">
  CREATE TABLE users (
    id INT PRIMARY KEY, 
    username VARCHAR(50),
    created_at TIMESTAMP
  );
</changeSet>

<changeSet id="2" author="bob">
  CREATE TABLE posts (
    id INT PRIMARY KEY,
    user_id INT,
    text VARCHAR(250),
    created_at TIMESTAMP
  );
</changeSet>

</databaseChangeLog>

Затем нам нужно добавить внешний ключ в таблицу posts на user_id, чтобы связать посты с пользователями:

<changeSet id="3" author="bob">
  ALTER TABLE posts
  ADD FOREIGN KEY (user_id) 
  REFERENCES users(id);
</changeSet>

И в конце решили удалить поле created_at, оно нам больше не нужно:

<changeSet id="4" author="bob">
  ALTER TABLE users
  DROP COLUMN created_at;
  
  ALTER TABLE posts
  DROP COLUMN created_at;
</changeSet>

Вот так по частям мы наращиваем историю изменений нашей базы данных в Liquibase. А затем можем легко применить эти изменения с помощью команды:

liquibase update

Или откатиться назад к нужной версии. Удобно, правда?

Преимущества использования Liquibase

Подведем итоги, какие основные плюсы дает использование Liquibase:

  • Полный контроль над структурой БД - можно легко и надежно управлять схемой
  • Возможность отката к предыдущим версиям - если что-то пошло не так, откатываемся и исправляем
  • Хранение истории изменений - всегда можно посмотреть, кто и что поменял в базе данных
  • Автоматизация развертывания - можно автоматически обновлять базу данных до последней версии
  • Параллельная работа в команде - несколько разработчиков могут одновременно вносить изменения
  • Переносимость между СУБД - схема в XML не зависит от конкретной базы данных

Как видишь, использование инструментов вроде Liquibase может сильно упростить работу с базами данных и повысить стабильность проекта.