SpringBoot интегрирует liquibase

Spring Boot

LiquiBaseЭто инструмент с открытым исходным кодом для реконструкции и миграции базы данных.Он записывает изменения базы данных в виде файлов журнала, а затем выполняет изменения в файлах журнала для обновления или отката базы данных до согласованного состояния. Его цель — предоставить решение, не зависящее от типа базы данных, которое мигрирует, выполняя файлы типа схемы. Его основные моменты заключаются в следующем:

  • Поддержка практически всех основных баз данных, таких как MySQL, PostgreSQL, Oracle, Sql Server, DB2 и т. д.;
  • Поддержка совместного обслуживания нескольких разработчиков;
  • Файл журнала поддерживает несколько форматов, таких как XML, YAML, JSON, SQL и т. д.;
  • Поддерживает несколько методов запуска, таких как командная строка, интеграция Spring, плагин Maven, плагин Gradle и т. д.

Адрес официального документа Liquibase:Woohoo. Перейдите на страницу base.org/document ATI…

1. Введите зависимости

Сначала введите зависимости в файл pom

<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-core</artifactId>
</dependency>

2. Укажите расположение файла конфигурации

Создайте новый в кодеLiquibaseConfigкласс для конфигурацииLiquibase, указав расположение файла конфигурации.

import javax.sql.DataSource;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LiquibaseConfig {

  @Bean
  public SpringLiquibase liquibase(DataSource dataSource) {
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource);
    //指定changelog的位置,这里使用的一个master文件引用其他文件的方式
    liquibase.setChangeLog("classpath:liquibase/master.xml");
    liquibase.setContexts("development,test,production");
    liquibase.setShouldRun(true);
    return liquibase;
  }

}

3. Напишите файл конфигурации

Структура каталога:

src/main/resourcesСоздайте новую папку в:liquibase, используется для храненияliquibaseсвязанные документы.

master.xml

затем вliquibaseновая папкаmaster.xmlкак основной файл.

<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">

    <includeAll path="liquibase/changelogs/" relativeToChangelogFile="false"/>

</databaseChangeLog>

includeAllЯрлыки могут загружать все журналы изменений в папку. Если можно использовать одну нагрузкуinclude.

includeAllВ теге есть два атрибута:pathа такжеrelativeToChangelogFile.

Attribute Description
file Name of the file to import required
relativeToChangelogFile Is the file path relative to the root changelog file rather than to the classpath. Defaults to "false" since 1.9

path(файл в теге include): указывает местоположение файла или папки для загрузки

relativeToChangelogFile: Относится ли путь расположения файла к корневому журналу изменений, значение по умолчанию — false, то есть относительно пути к классам.

changelog

еще одинliquibaseновая папкаchangelogsПапка используется для хранения журнала изменений.

Создайте новый здесьchangelog-1.0.xml

<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">

    <changeSet id="20190713-01" author="solo">
        <createTable tableName="project_info">
            <column name="project_id" type="varchar(64)" encoding="utf8" remarks="项目id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="project_name" type="varchar(255)" encoding="utf8" remarks="项目名字"/>
            <column name="project_difficulty" type="float" encoding="utf8" remarks="项目难度"/>
            <column name="category_id" type="varchar(64)" encoding="utf8" remarks="项目类型类目编号"/>
            <column name="project_status" type="int(11)" encoding="utf8" remarks="项目状态, 0招募中,1 进行中,2已完成,3失败,4延期,5删除"/>
            <column name="project_desc" type="varchar(512)" encoding="utf8" remarks="项目简介"/>
            <column name="project_creater_id" type="varchar(64)" encoding="utf8" remarks="项目创建者id"/>
            <column name="team_id" type="varchar(64)" encoding="utf8" remarks="项目所属团队id"/>
            <column name="create_time" type="bigint(64)" encoding="utf8" remarks="创建时间"/>
            <column name="update_time" type="bigint(64)" encoding="utf8" remarks="更新时间"/>
        </createTable>
    </changeSet>
    
    <changeSet id="20190713-02" author="solo">
        <createTable tableName="project_category" remarks="项目类型表">
            <column name="id" type="varchar(64)" remarks="项目类型id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(255)" remarks="类目类型名称"/>
            <column name="status" type="int(11)" remarks="状态。1正常,2删除"/>
            <column name="remark" type="varchar(255)" remarks="备注"/>
        </createTable>
    </changeSet>

    <changeSet id="20190713-03" author="solo">
        <createTable tableName="project_like_user" remarks="项目点赞表">
            <column name="id" type="varchar(64)" remarks="主键id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="project_id" type="varchar(64)" remarks="项目id"/>
            <column name="user_id" type="varchar(64)" remarks="点赞的用户id"/>
            <column name="status" type="int(11)" remarks="点赞状态,0 取消点赞,1点赞"/>
            <column name="type" type="int(11)" remarks="类型 1点赞"/>
            <column name="create_time" type="bigint(64)" remarks="创建时间"/>
            <column name="update_time" type="bigint(64)" remarks="更新时间"/>
        </createTable>
    </changeSet>

    <changeSet id="20190713-04" author="solo">
        <createTable tableName="project_picture" remarks="项目图片表">
            <column name="id" type="varchar(64)" remarks="图片id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="project_id" type="varchar(64)" remarks="项目id"/>
            <column name="picture_url" type="varchar(64)" remarks="图片地址"/>
            <column name="picture_url_32" type="varchar(64)" remarks="图片地址32位"/>
            <column name="picture_url_64" type="varchar(64)" remarks="图片地址64位"/>
        </createTable>
    </changeSet>

</databaseChangeLog>

Если ваш проект с самого начала использует liquibase, вы можете написать его, как указано выше, и написать все операторы построения таблиц в журнале изменений.

Если поначалу это бесполезно, и вы хотите внедрить liquibase позже, вы можете экспортировать предыдущую базу данных в sql, а затем импортировать файл sql. Способ следующий:

<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">

    <include file="liquibase/changelogs/project.sql" relativeToChangelogFile="false"/>

</databaseChangeLog>

Прямой экспорт файла базы данных проектаproject.sqlпройти черезincludeПредставьте этикетку.

если<include>То, как sql-файл сообщает об ошибке, можно представить по-другому, используя<sqlFile>Этикетка

<?xml version="1.0" encoding="UTF-8"?>
<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">

    <changeSet id="1" author="solo">
        <sqlFile path="classpath:/liquibase/changelogs/project.sql" encoding="UTF-8" />
    </changeSet>
</databaseChangeLog>

Это все, что нужно SpringBoot для интеграции Liquibase.

Если у вас есть какие-либо вопросы или хорошие предложения, вы можете добавить WX для связи:douglas1840