Liquibase 和 Flyway 是兩款成熟的、優秀的、開源/商業版的資料庫版本管理工具,鑒于 Flyway 的社區版本對 Oracle 資料庫支持存在限制,所以 boot-admin 選擇整合 Liquibase 提供資料庫版本管理能力支持,
Liquibase 開源版使用 Apache 2.0 協議,
Liquibase的適用情形?
- 在你的專案進行版本升級的時候,大概率情況下資料庫也需要同步升級,Liquibase 會自動掃描資料庫遷移檔案(changeSet),將遷移檔案的版本號與歷史記錄表(changelog )中的版本號進行對比,略過已執行的的遷移檔案,順序執行未執行的新版本遷移檔案,最終實作資料庫與代碼版本相匹配;
- 當多人協作開發專案的時候,系統源代碼可使用 git 保持同步,那么資料庫的同步就可交由 liquibase 來保證;
- 使用 liquibase 可以方便地比較兩個資料庫的差異;
- 使用 liquibase 還支持資料庫版本回滾,
Liquibase的優點有哪些?
- 組態檔支持SQL、XML、JSON 或者 YAML;
- 可兼容14種主流資料庫如 oracle,mysql 等,支持平滑遷移;
- 版本控制按序執行;
- 可以用背景關系控制sql在何時何地如何執行;
- 具備在應用中具有if / then邏輯的能力;
- 支持 schema 的變更;
- 根據組態檔自動生成sql陳述句用于預覽;
- 可重復執行遷移;
- 可插件拓展;
- 可回滾;
- 支持schema方式的多租戶(multi-tenant);
- 能夠在多種資料庫型別上具有相同的更改描述;
- 生成的資料庫歷史記錄檔案;
- 能夠輕松指定更復雜的多陳述句更改,
整合要點
boot-admin 是一款采用前后端分離模式、基于 SpringCloud 微服務架構的SaaS后臺管理框架,系統內置基礎管理、權限管理、運行管理、定義管理、代碼生成器和辦公管理6個功能模塊,集成分布式事務 Seata、作業流引擎 Flowable、業務規則引擎 Drools、后臺作業調度框架 Quartz 等,技術堆疊包括 Mybatis-plus、Redis、Nacos、Seata、Flowable、Drools、Quartz、SpringCloud、Springboot Admin Gateway、Liquibase、jwt、Openfeign、I18n等,
專案原始碼倉庫github
專案原始碼倉庫gitee
引入Maven依賴
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
添加配置
spring:
liquibase:
enabled: true
change-log: classpath:liquibase/master.xml
創建master.xml
在 resources 下創建檔案夾 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>
在 liquibase 檔案夾下創建 changelogs 和 sql 兩個檔案夾,如下圖所示:

撰寫資料庫變更單元 changeSet
在 resources\liquibase\changelogs 下創建 changeSet 檔案,推薦每月一個 xml 檔案,檔案名格式:【changelog-年度+月份.xml】,如:changelog-202304.xml
常用操作舉例:
創建表
<changeSet author="admin (generated)" id="00001-9">
<createTable remarks="行政區劃表" tableName="TB_ADM_DIV">
<column name="GUID" remarks="主鍵" type="NVARCHAR2(38)">
<constraints nullable="false" primaryKey="true" primaryKeyName="PK_TB_ADM_DIV"/>
</column>
<column name="ADM_DIV_CODE" remarks="行政區劃代碼" type="NVARCHAR2(12)">
<constraints nullable="false"/>
</column>
<column name="ADM_DIV_NAME" remarks="行政區劃名稱" type="NVARCHAR2(100)">
<constraints nullable="false"/>
</column>
<column name="CREATE_BY" remarks="記錄創建者" type="NVARCHAR2(100)">
<constraints nullable="false"/>
</column>
<column name="CREATE_TIME" remarks="記錄創建時間" type="${type.datetime}">
<constraints nullable="false"/>
</column>
<column name="MODIFY_BY" remarks="記錄最后修改者" type="NVARCHAR2(100)">
<constraints nullable="false"/>
</column>
<column name="MODIFY_TIME" remarks="記錄最后修改時間" type="${type.datetime}">
<constraints nullable="false"/>
</column>
<column defaultValueComputed="${now}" name="DATESTAMP" remarks="時間戳" type="${type.datetime}">
<constraints nullable="false"/>
</column>
<column name="ENABLED" remarks="啟用狀態;ENABLED" type="NVARCHAR2(1)">
<constraints nullable="false"/>
</column>
<column name="DELETED" remarks="洗掉狀態;DELETED" type="NVARCHAR2(1)">
<constraints nullable="false"/>
</column>
<column name="VERSION" remarks="樂觀鎖" type="${type.int}">
<constraints nullable="false"/>
</column>
<column name="REMARKS" remarks="備注" type="NVARCHAR2(900)"/>
<column name="TENANT_ID_" remarks="租戶ID" type="NVARCHAR2(38)">
<constraints nullable="false"/>
</column>
<column name="PARENT_GUID" remarks="父級GUID" type="NVARCHAR2(38)">
<constraints nullable="false"/>
</column>
<column name="LEAF" remarks="是否末級;YESNO" type="NVARCHAR2(1)">
<constraints nullable="false"/>
</column>
<column name="SORT" remarks="順序號" type="${type.int}">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
添加表欄位
<changeSet author="admin" id="00002-1">
<addColumn tableName="TB_ADM_DIV">
<column name="EXT" remarks="擴展" type="VARCHAR(64)"/>
</addColumn>
</changeSet>
洗掉表欄位
<changeSet author="admin" id="00002-2">
<dropColumn tableName="TB_ADM_DIV" columnName="EXT"/>
</changeSet>
修改表欄位說明
<changeSet author="admin" id="00002-3">
<setColumnRemarks tableName="TB_ADM_DIV" columnName="EXT" remarks="擴展欄位"/>
</changeSet>
修改表欄位型別
<changeSet author="admin" id="00002-4">
<modifyDataType tableName="TB_ADM_DIV" columnName="EXT" newDataType="VARCHAR2(2000)"/>
</changeSet>
創建視圖
<changeSet author="admin (generated)" id="00001-1" dbms="oracle">
<createView fullDefinition="true" remarks="表和視圖" viewName="V_TABLES_MASTER">
CREATE OR REPLACE FORCE VIEW V_TABLES_MASTER (TABLE_SCHEMA, TABLENAME, TABLETYPE, COMMENTS, TENANT_ID_) AS
select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') TABLE_SCHEMA,
t.tname tableName,
tabtype tabletype,
f.comments comments,
'DEMO' TENANT_ID_
from tab t
inner join user_tab_comments f
on t.tname = f.table_name
where tname != 'DATABASECHANGELOG'
and tname != 'DATABASECHANGELOGLOCK'
and tname != 'UNDO_LOG'
</createView>
</changeSet>
<changeSet author="37514 (generated)" id="00000-2" dbms="mysql">
<createView fullDefinition="true" remarks="表和視圖" viewName="V_TABLES_MASTER">
CREATE OR REPLACE VIEW V_TABLES_MASTER AS
SELECT
TABLE_SCHEMA,
TABLE_NAME AS TABLENAME,
case when table_type='BASE TABLE' then 'TABLE' ELSE table_type END AS TABLETYPE,
TABLE_COMMENT AS COMMENTS,
'DEMO' TENANT_ID_
FROM
information_schema.`TABLES`
WHERE table_name != 'databasechangeloglock' AND TABLE_NAME != 'databasechangelog' AND TABLE_NAME != 'undo_log'
</createView>
</changeSet>
兼容 Oracle 和 Mysql 配置
<property name="type.datetime" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/date" dbms="oracle"/>
<property name="type.datetime" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/timestamp" dbms="mysql"/>
<property name="type.int" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/NUMBER(*, 0)" dbms="oracle"/>
<property name="type.int" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/INT" dbms="mysql"/>
<property name="type.decimal" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/NUMBER(*, 2)" dbms="oracle"/>
<property name="type.decimal" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/DECIMAL" dbms="mysql"/>
<property name="now" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/SYSDATE" dbms="oracle"/>
<property name="now" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/now()" dbms="mysql,h2"/>
<property name="autoIncrement" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/true" dbms="mysql,h2,postgresql,oracle"/>
<property name="amount" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/decimal(20,2)"/>
<property name="uuid" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/sys_guid()" dbms="oracle"/>
<property name="uuid" value="https://www.cnblogs.com/soft1314/archive/2023/05/05/UUID()" dbms="mysql"/>
執行 SQL 檔案
<changeSet id="20000820-003" author="Administrator" dbms="oracle">
<sqlFile dbms="oracle" path="classpath:/liquibase/sql/seata-undo_log-oracle.sql" />
</changeSet>
<changeSet id="20000820-003" author="Administrator" dbms="mysql">
<sqlFile dbms="mysql" path="classpath:/liquibase/sql/seata-undo_log-mysql.sql" />
</changeSet>
需將對應 sql 檔案放在指定檔案夾中,
Liquibase changeSet常用命令清單
add
| 標簽 | 描述 |
|---|---|
| addAutoIncrement | 將一個已存在的列轉換為自增 |
| addColunm | 增加列 |
| addDefaultValue | 對已存在的列增加默認值 |
| addForeignKeyConstraint | 對已存在的列增加外鍵約束 |
| addLookupTable | 創建外鍵關聯的表 |
| addNotNullConstraint | 對已存在的列增加非空約束 |
| addPrimaryKey | 對已存在的列增加主鍵約束 |
| ddUniqueConstraint | 對已存在的列增加主鍵約束 |
create
| 標簽 | 描述 |
|---|---|
| createIndex | 創建索引 |
| createProcedure | 創建存盤程序 |
| createSequence | 創建序列 |
| createTable | 創建表 |
| createView | 創建視圖 |
drop
| 標簽 | 描述 |
|---|---|
| dropAllForeignKeyConstraints | 洗掉全部的外鍵約束 |
| dropColumn | 洗掉列 |
| dropDefaultValue | 洗掉默認值設定 |
| dropForeignKeyConstraint | 洗掉某一列的外鍵約束 |
| dropNotNullConstraint | 洗掉非空約束 |
| dropIndex | 洗掉索引 |
| dropSequence | 洗掉約束 |
| dropProcedure | 洗掉存盤程序 |
| dropPrimaryKey | 洗掉主鍵 |
| dropTable | 洗掉表 |
| dropUniqueConstraint | 洗掉唯一性約束 |
| dropView | 洗掉視圖 |
rename
| 標簽 | 描述 |
|---|---|
| renameColumn | 重命名列 |
| renameSequence | 重命名序列 |
| renameTable | 重命名表 |
| renameView | 重命名視圖 |
sql
| 標簽 | 描述 |
|---|---|
| sql | 原生SQL |
| sqlFile | 引入 SQL 檔案 |
other
| 標簽 | 描述 | 標簽 | 描述 |
|---|---|---|---|
| alterSequence | 修改序列 | customChange | 自定義change型別,需要自己實作liquibase.change.custom.CustomSqlChange、liquibase.change.custom.CustomTaskChange介面 |
| delete | 洗掉資料 | empty | 空操作 |
| executeCommand | 執行系統命令,如 mysqldump | insert | 插入資料 |
| loadData | 加載 csv 檔案到已存在的表中 | loadUpdateData | 加載 csv 檔案到已存在的表中,但是會判斷是否存在,存在更新,否則新增 |
| mergeColumns | 將兩列值合并在一起,存入新列中 | modifyDataType | 修改列資料型別 |
| output | 記錄一條訊息并繼續執行 | setColumnRemarks | 列上添加備注 |
| setTableRemarks | 表上添加備注 | stop | 通過訊息停止 Liquibase |
| tagDatabase | 將標簽應用于資料庫以供將來回滾 | update | 更新資料 |
本文來自博客園,作者:超然樓,轉載請注明原文鏈接:https://www.cnblogs.com/soft1314/p/17375273.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551713.html
標籤:其他
上一篇:NSIS官方認證插件集成安裝包
下一篇:返回列表
