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
標籤裡有兩個屬性: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 標籤裡是 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