Введение
В быстро меняющемся мире разработки программного обеспечения управление схемами баз данных и контролем версий имеет решающее значение для поддержания целостности данных и обеспечения бесперебойного обновления приложений. 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 в рабочий процесс разработки снижает риски, улучшает сотрудничество между командами разработчиков и обеспечивает плавное развитие базы данных вместе с вашими приложениями.
Приятного обучения!!!