1. 程式人生 > 程式設計 >SpringBoot 整合 liquibase

SpringBoot 整合 liquibase

LiquiBase是一個用於資料庫重構和遷移的開源工具,通過日誌檔案的形式記錄資料庫的變更,然後執行日誌檔案中的修改,將資料庫更新或回滾到一致的狀態。它的目標是提供一種資料庫型別無關的解決方案,通過執行schema型別的檔案來達到遷移。其有點主要有以下:

  • 支援幾乎所有主流的資料庫,如MySQL,PostgreSQL,Oracle,Sql Server,DB2等;
  • 支援多開發者的協作維護;
  • 日誌檔案支援多種格式,如XML,YAML,JSON,SQL等;
  • 支援多種執行方式,如命令列、Spring整合、Maven外掛、Gradle外掛等。

liquibase 官方檔案地址:www.liquibase.org/documentati…

一、引入依賴

先在 pom 檔案裡引入依賴

<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-core</artifactId>
</dependency>
複製程式碼

二、指定配置檔案位置

在程式碼中新建一個 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; } } 複製程式碼

三、編寫配置檔案

目錄結構:

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 標籤可以把一個資料夾下的所有 changelog 都載入進來。如果單個載入可以用 include

includeAll 標籤裡有兩個屬性:pathrelativeToChangelogFile

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 標籤裡是 file):指定要載入的檔案或資料夾位置

relativeToChangelogFile :檔案位置的路徑是否相對於 root changelog 是相對路徑,預設 false,即相對於 classpath 是相對路徑。

changelog

另在 liquibase 資料夾下新建 changelogs 資料夾用來存放 changelog。

這裡新建一個 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,那可以像上面這樣寫,把建表語句都寫在 changelog 裡。

如果一開始沒用,後期想引入 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