主頁 > 後端開發 > boot-admin整合Liquibase實作資料庫版本管理

boot-admin整合Liquibase實作資料庫版本管理

2023-05-06 07:37:48 後端開發

Liquibase 和 Flyway 是兩款成熟的、優秀的、開源/商業版的資料庫版本管理工具,鑒于 Flyway 的社區版本對 Oracle 資料庫支持存在限制,所以 boot-admin 選擇整合 Liquibase 提供資料庫版本管理能力支持,
Liquibase 開源版使用 Apache 2.0 協議,

Liquibase的適用情形?

  • 在你的專案進行版本升級的時候,大概率情況下資料庫也需要同步升級,Liquibase 會自動掃描資料庫遷移檔案(changeSet),將遷移檔案的版本號與歷史記錄表(changelog )中的版本號進行對比,略過已執行的的遷移檔案,順序執行未執行的新版本遷移檔案,最終實作資料庫與代碼版本相匹配;
  • 當多人協作開發專案的時候,系統源代碼可使用 git 保持同步,那么資料庫的同步就可交由 liquibase 來保證;
  • 使用 liquibase 可以方便地比較兩個資料庫的差異;
  • 使用 liquibase 還支持資料庫版本回滾,

Liquibase的優點有哪些?

  1. 組態檔支持SQL、XML、JSON 或者 YAML;
  2. 可兼容14種主流資料庫如 oracle,mysql 等,支持平滑遷移;
  3. 版本控制按序執行;
  4. 可以用背景關系控制sql在何時何地如何執行;
  5. 具備在應用中具有if / then邏輯的能力;
  6. 支持 schema 的變更;
  7. 根據組態檔自動生成sql陳述句用于預覽;
  8. 可重復執行遷移;
  9. 可插件拓展;
  10. 可回滾;
  11. 支持schema方式的多租戶(multi-tenant);
  12. 能夠在多種資料庫型別上具有相同的更改描述;
  13. 生成的資料庫歷史記錄檔案;
  14. 能夠輕松指定更復雜的多陳述句更改,

整合要點

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官方認證插件集成安裝包

下一篇:返回列表

標籤雲
其他(158477) Python(38118) JavaScript(25401) Java(18023) C(15222) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7162) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5335) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • boot-admin整合Liquibase實作資料庫版本管理

    Liquibase 和 Flyway 是兩款成熟的、優秀的、開源/商業版的資料庫版本管理工具,鑒于 Flyway 的社區版本對 Oracle 資料庫支持存在限制,所以 boot-admin 選擇整合 Liquibase 提供資料庫版本管理能力支持。 Liquibase 開源版使用 Apache 2. ......

    uj5u.com 2023-05-06 07:37:48 more
  • NSIS官方認證插件集成安裝包

    本次制作的集成安裝包集成了NSIS官方wiki認證的所有插件(無法下載或者嚴重過時的除外),翻譯了部分比較冷門插件的使用說明。額外集成了關于皮膚,按鈕美化以及用于視窗子類化等少數幾個優秀的第三方插件。所有插件皆為當前能得到的最新版本。 由于兼容性原因,在不干擾正常使用的情況下強烈建議將nsis升級為 ......

    uj5u.com 2023-05-06 07:37:38 more
  • 22基于java的電影院售票管理系統

    專案背景 隨著互聯網和電子商務的快速發展,開發一個電影院訂票系統來幫助電影院對電影資訊,售票資訊進行統一化的資訊管理; 遇到的問題 在設計的程序中,需要解決以下的幾個問題: 電影院會有多個播放廳,從而在同一時間播放不同的電影來滿足客戶需求 每個廳的大小可能不同,即容納的人數不同 電影院會不斷引進新片 ......

    uj5u.com 2023-05-06 07:37:32 more
  • 信奧賽題1105:陣列逆序重存放

    新奧賽一本通,題1105 1105:陣列逆序重存放 時間限制: 1000 ms 記憶體限制: 65536 KB 提交數: 70600 通過數: 47540 【題目描述】 將一個陣列中的值按逆序重新存放。例如,原來的順序為8,6,5,4,1。要求改為1,4,5,6,8。 【輸入】 兩行:第一行陣列中元素 ......

    uj5u.com 2023-05-06 07:37:27 more
  • Java的反射機制

    Java 的反射機制允許在程式運行期間,借助反射 API 獲取類的內部資訊,并能直接操作物件的內部屬性及方法。 ......

    uj5u.com 2023-05-06 07:37:24 more
  • 23基于java教師科研專案管理系統

    基于java教師科研專案管理系統,可用于高校創新專案申報平臺,大學專案申報平臺,高校大創專案申報,大學生創新專案申報,高校科研管理平臺,科研管理平臺,技術類專案申報,互聯網+專案申報系統; ......

    uj5u.com 2023-05-06 07:37:20 more
  • 記錄一次非常麻煩的除錯

    此次記錄一次非常麻煩的除錯問題,不是純知識分享,只是記錄這次除錯程序引以為戒。 問題簡介 這個功能是公司2021年寫的老功能,一直都沒有更新過代碼,這次在匯入一個1.03G的大檔案進行讀取的程序中出問題了。 簡單介紹一下這個功能: 公司使用的spring boot框架構建專案,該功能為專案內的一個接 ......

    uj5u.com 2023-05-06 07:37:07 more
  • LeetCode 59. 螺旋矩陣 II

    題目鏈接:LeetCode 59. 螺旋矩陣 II 本題不涉及演算法,只是簡單的模擬,但是由于邊界條件比較多,因此容易出錯。 分析題干:題目要求按照右、下、左、上、這樣的順序對陣列進行填充,填充的值為 1 ~ n*n,因此問題的關鍵就是找到待填充的位置,將其值賦值為 i 即可。 由于填充的順序是有規律 ......

    uj5u.com 2023-05-06 07:36:58 more
  • Go語言入門14(channel通道01)

    channel(一) ? channel用于goroutines之間的通信,讓它們之間可以進行資料交換。像管道一樣,一個goroutine_A向channel_A中放資料,另一個goroutine_B從channel_A取資料 channel 基本語法 // 因為channel是指標型別的資料型別, ......

    uj5u.com 2023-05-06 07:36:41 more
  • 線上FullGC問題排查實踐——手把手教你排查線上問題

    作者:京東科技 韓國凱 一、問題發現與排查 1.1 找到問題原因 問題起因是我們收到了jdos的容器CPU告警,CPU使用率已經達到104% 觀察該機器日志發現,此時有很多執行緒在執行跑批任務。正常來說,跑批任務是低CPU高記憶體型,所以此時考慮是FullGC引起的大量CPU占用(之前有類似情況,告知用 ......

    uj5u.com 2023-05-06 07:36:37 more