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

来源:https://www.cnblogs.com/soft1314/archive/2023/05/05/17375273.html
-Advertisement-
Play Games

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


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="date" dbms="oracle"/>
    <property name="type.datetime" value="timestamp" dbms="mysql"/>
    <property name="type.int" value="NUMBER(*, 0)" dbms="oracle"/>
    <property name="type.int" value="INT" dbms="mysql"/>
    <property name="type.decimal" value="NUMBER(*, 2)" dbms="oracle"/>
    <property name="type.decimal" value="DECIMAL" dbms="mysql"/>
    <property name="now" value="SYSDATE" dbms="oracle"/>
    <property name="now" value="now()" dbms="mysql,h2"/>
    <property name="autoIncrement" value="true" dbms="mysql,h2,postgresql,oracle"/>
    <property name="amount" value="decimal(20,2)"/>
    <property name="uuid" value="sys_guid()" dbms="oracle"/>
    <property name="uuid" value="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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 使用go語言做開發差不多快一年了,主要用來寫後端Web服務,從一開始吐槽他的結構體,比如創建個複雜的JSON格式數據,那是相當的痛苦。還有 err 處理寫的巨麻煩。 當然,go 也有爽的地方,創建個線協程簡直太簡單了。 到後來慢慢接受,覺得效率還行,因為是靜態強類型語言,在修改完項目代碼之後, ...
  • 最近的需求里有這樣一個場景,要校驗一個集合中每個對象的多個Id的有效性。比如一個Customer對象,有3個Id:id1,id2,id3,要把這些Id全部取出來,然後去資料庫里查詢它是否存在。 @Data @AllArgsConstructor public class Customer { pri ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。 本篇介紹如何在 VS 高版本中使用 vld2.5.1。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. 使用前的準備 參考本人另一篇博客 安裝 Visual Leak Detector 下載 vld-2.5.1-setup.exe 並 ...
  • 項目背景 隨著互聯網的普及,已經和我們的生活不可分割;寵物漸漸的已經成為了我們的好朋友,寵物醫院管理系統可以幫助用戶合理的管理寵物,呵護寵物的健康,對寵物起到了一個健康監控的作用; 項目介紹 系統總體分為3個角色:分別是系統管理員;醫生和用戶;不能的角色擁有不同的功能許可權,下麵詳細介紹: 系統管理員 ...
  • 作為開發it行業一員,學習借鑒他人項目是很有必要的,所以我們一般都會從github或者 Gitee 上面去參考借鑒他人的項目來學習增加自己的項目經驗 但是github你真的用對了嘛,他的功能其實很強大!!! githu項目搜索 關鍵字搜索 在Github搜索欄中輸入與您感興趣的技術相關的關鍵詞,例如 ...
  • (MyBatis 配置詳解) mybatis-config.xml 核心配置文件 mybatis-config.xml 包含的內容如下 configuration(配置) properties(屬性) settings(設置) typeAliases(類型別名) typeHandlers(類型處理器 ...
  • ##(1) vector:將元素置於一個動態數組中,可以隨機存儲元素(也就是用索引直接存取)。 數組尾部添加或刪除元素非常迅速。但在中部或頭部就比較費時。 *代碼演示:* 取: at在下標越界時會拋出異常,我們能捕獲異常進行處理;而[]下標越界會讓程式直接終止; 構造函數: cbegin, cend ...
  • ​ C/C++編譯器的預設位元組對齊方式為自然對界。即在預設情況下,編譯器為每一個變數或是數據單元按其自然對界條件分配空間。 在結構中,編譯器為結構的每個成員按其自然對界(alignment)條件分配空間。各個成員按照它們被聲明的順序在記憶體中順序存儲(成員之間可能有插入的空位元組),第一個成員的地址和整 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...