Введение

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

Ликвибаза в двух словах

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

Ключевые компоненты Liquibase:

Журнал изменений. Журнал изменений – это файл, содержащий историю всех изменений, внесенных в базу данных. Обычно он пишется в формате XML, но также может быть написан в формате JSON или YAML.

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

Таблица DatabaseChangeLog:Таблица DatabaseChangeLog — это специальная таблица, которую Liquibase использует для отслеживания состояния журнала изменений. В нем хранится информация о наборах изменений, которые были применены, находятся в ожидании и откат которых был отменен.

Таблица DatabaseChangeLogLock:Таблица DatabaseChangeLogLock представляет собой таблицу блокировок, которую Liquibase использует для предотвращения одновременных изменений в базе данных.

Liquibase Core: Liquibase Core — это базовая библиотека, обеспечивающая базовые функции Liquibase. Он включает классы для чтения и анализа журналов изменений, применения наборов изменений и отслеживания состояния базы данных.

Плагины Liquibase:Плагины Liquibase — это расширения, которые предоставляют дополнительные функции Liquibase. Их можно использовать для поддержки различных платформ баз данных, добавления новых функций или настройки поведения Liquibase.

В дополнение к этим ключевым компонентам Liquibase также предоставляет инструмент командной строки, API Java и плагин Maven. Инструмент командной строки можно использовать для применения наборов изменений, отката изменений и создания отчетов.

Java API можно использовать для программного применения наборов изменений и управления журналом изменений.

Плагин Maven можно использовать для интеграции Liquibase со сборками Maven.

Значение Liquibase в управлении базами данных

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

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

Эти функции контроля версий дают несколько существенных преимуществ:

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

Историческая аналитика и аудит. Этот инструмент обеспечивает четкую историческую запись изменений базы данных, что оказывается неоценимым для целей отладки и аудита.
Возможность отката: В случае необходимости изменение приводит к проблемам, Liquibase предлагает возможность отката к предыдущему состоянию, сводя к минимуму время простоя и потерю данных.

2. Единообразие во всех средах →Расхождения между средами разработки, тестирования и производства являются обычным явлением при разработке программного обеспечения. Несоответствия в схеме базы данных или данных могут привести к неясным ошибкам и непредвиденным осложнениям. Liquibase занимает центральное место в обеспечении единообразия в этих средах за счет автоматизации применения изменений.

Воспроизводимые сборки. Liquibase гарантирует согласованное построение и миграцию базы данных вашего приложения во всех средах, снижая риск возникновения проблем типа «оно работает на моей машине».

3. Рефакторинг и развитие баз данных →По мере развития программных приложений развиваются и их базы данных. Такие задачи, как добавление новых таблиц, изменение существующих или изменение типов данных столбцов, являются рутинными, но чреваты потенциальными ошибками. Liquibase предлагает структурированный и контролируемый подход для выполнения рефакторинга базы данных.

Постепенные изменения. Liquibase выступает за внесение изменений постепенно, разбивая сложные обновления базы данных на управляемые шаги. Это снижает риск сбоев в работе приложений во время обновлений.

4. Кроссплатформенная совместимость →В современном мире программного обеспечения приложения работают в различных системах управления базами данных, таких как PostgreSQL, MySQL, Oracle и Microsoft SQL Server. Liquibase поддерживает несколько платформ баз данных, предоставляя вам преимущество единого набора инструментов для управления базами данных, независимо от базовой технологии.

5. Автоматизация и интеграция с CI/CD →Интегрируя Liquibase в конвейер непрерывной интеграции/непрерывного развертывания (CI/CD), вы можете значительно оптимизировать процессы разработки. Liquibase автоматизирует изменения схемы базы данных, обеспечивая единообразие приложений на всех этапах разработки и развертывания. Такая автоматизация сводит к минимуму человеческие ошибки и ускоряет выпуск новых функций.

Ликвибаза с пружинной загрузкой

Здесь я предоставлю вам пошаговый пример того, как настроить Liquibase в проекте Spring Boot и определить изменения базы данных с помощью наборов изменений Liquibase.

Шаг 1. Создайте проект Spring Boot

Мы можем создать проект Spring Boot, используя предпочитаемую вами среду IDE или веб-сайт Spring Initializer (https://start.spring.io/). Обязательно укажите необходимые зависимости для Spring Boot и базы данных, которую мы собираемся использовать (например, H2, MySQL, PostgreSQL и т. д.).

Шаг 2. Добавьте зависимости Liquibase

В pom.xml проекта (если вы используете Maven) или build.gradle (если вы используете Gradle) добавьте зависимости Liquibase. Например, если вы используете Maven, добавьте следующие зависимости:

<?xml version="1.0" encoding="UTF-8"?>
<project
 xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>3.1.3</version>
  <relativePath/>
  <!-- lookup parent from repository -->
 </parent>
 <groupId>com.example.demo</groupId>
 <artifactId>spring-boot-liquibase</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>spring-boot-liquibase</name>
 <description>Demo project for Spring Boot With Liquibase</description>
 <properties>
  <java.version>17</java.version>
 </properties>
 <dependencies>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
     <groupId>org.liquibase</groupId>
     <artifactId>liquibase-core</artifactId>
  </dependency>
  <dependency>
     <groupId>com.h2database</groupId>
     <artifactId>h2</artifactId>
     <scope>runtime</scope>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
  </dependency>
  <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <optional>true</optional>
  </dependency>
  <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <scope>test</scope>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
   </plugin>
  </plugins>
 </build>
</project>

Шаг 3. Настройте Liquibase

Создайте файл liquibase.properties или добавьте конфигурацию Liquibase в свой application.yml (или application.properties), чтобы указать детали подключения к базе данных. Вот пример базы данных H2 в памяти:

spring:
  liquibase:
    contexts: local
  datasource:
    url: jdbc:h2:~/demo
    username: sa
    password: ''
    driverClassName: org.h2.Driver
  jpa:
    spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
  logging:
    level:
      "liquibase": info

В этом примере мы указываем URL-адрес базы данных, драйвер, имя пользователя, пароль и местоположение файла журнала изменений Liquibase (db-changelog-master.yaml). Кроме того, у нас есть setspring.liquibase.contexts(который представляет собой список контекстов времени выполнения, разделенных запятыми, которые нужно использовать) в local (поскольку мы запускаем приложение локально).

Шаг 4. Создайте наборы изменений Liquibase

Создайте структуру каталогов для ваших наборов изменений Liquibase. Например:

src/main/resources/db/changelog

Внутри каталога changelog создайте файл db-changelog-master.yaml (или с похожим именем), который ссылается на ваши индивидуальные наборы изменений. Например:

databaseChangeLog:
    - include:
          file: db/tables/1.0.0_create_test_user.yaml

Внутри каталога tables создайте отдельные YAML-файлы набора изменений Liquibase. Liquibase также поддерживает форматы журнала изменений .sql, .xml или .json.

Например, 1.0.0-create-test-user.yaml:

databaseChangeLog:
  - changeSet:
      id: create-table-test-user
      author: liquibase
      preConditions:
        - onFail: MARK_RAN
          not:
            tableExists:
              tableName: test_user
      changes:
        - createTable:
            columns:
              - column:
                  autoIncrement: true
                  constraints:
                    nullable: false
                    primaryKey: true
                    primaryKeyName: USER_PK
                  name: id
                  type: BIGINT
              - column:
                  constraints:
                    nullable: false
                  name: username
                  type: VARCHAR(250)
              - column:
                  constraints:
                    nullable: false
                  name: first_name
                  type: VARCHAR(250)
              - column:
                  name: last_name
                  type: VARCHAR(250)
              - column:
                  constraints:
                    nullable: false
                  name: email
                  type: VARCHAR(255)
            tableName: test_user

Создайте соответствующий класс сущности для упомянутой выше таблицы, как показано ниже:

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name = "test_user")
public class TestUser {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "username")
    private String userName;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email")
    private String email;
}

Шаг 5. Запустите приложение Spring Boot

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

Вы можете найти пример кода: https://github.com/reetesh043/spring-boot-liquibase

Заключение

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

Приятного обучения!!!

Использованная литература: