Liquibase使用(轉)


文章目錄

介紹
快速使用
Springboot中
引入依賴
配置日志文件ChangeLog
編寫變更記錄ChangeSet
Maven中
引入依賴
配置liquibase.properties
編寫變更記錄ChangeSet
版本回滾
回滾指定次數
回滾到指定tag
輸出回滾語句
輸出變更記錄
一些規范
參考資料
介紹

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

支持幾乎所有主流的數據庫,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
支持多開發者的協作維護;
日志文件支持多種格式,如XML, YAML, JSON, SQL等;
支持多種運行方式,如命令行、Spring集成、Maven插件、Gradle插件等。
快速使用

Springboot中

引入依賴

<dependencies>
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
    </dependency>
    <dependency>
</dependencies>

配置日志文件ChangeLog

  1. resources目錄中創建/db/changelog目錄作為日志文件存放目錄
  2. 在目錄中創建日志文件db.changelog-master.yml
  3. application.yml中配置changelog路徑
spring:
  liquibase: 
    # 不配置默認會查找'classpath:/db/changelog/db.changelog-master.yaml'文件
    change-log: 'classpath:/db/changelog/db.changelog-master.yml'

編寫變更記錄ChangeSet

  1. 編寫初始數據庫腳本
databaseChangeLog:
  - changeSet:
      # 唯一id,建議使用Flayway的命名格式'V<version>[_<SEQ>][__description]'
      id: V1.0_0__init
      # 作者
      author: Cheivin
      # 描述
      comment: "初始化腳本內容,加載初始數據"
      # 啟用事物
      runInTransaction: true
      # 變更腳本
      changes:
        # 創建表格
        - createTable:
            tableName: user
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
                  remarks:
              - column:
                  name: username
                  type: VARCHAR(50)
                  constraints:
                    nullable: false
              - column:
                  name: password
                  type: VARCHAR(50)
                  constraints:
                    nullable: false
        # 加載數據
        - loadData:
            tableName: user
            columns:
              - column:
                  header: username
                  name: username
              - column:
                  header: password
                  name: password
            encoding: UTF-8
            file: db/data/init-data.csv
        # 標記,用於回滾時指定版本
        - tagDatabase:
            tag: V1.0_0__init
  1. 運行項目后,查看數據庫
  2. 修改changelog,增加變更數據庫腳本
# 在databaseChangeLog后追加
  - changeSet:
      id: V1.0_1__mod
      author: Cheivin
      comment: "修改用戶表,增加賬單表"
      runInTransaction: true
      changes:
        # 通過標准格式添加字段
        - addColumn:
            # 目標表
            tableName: user
            columns:
              - column:
                  name: state
                  type: tinyint
                  # 默認值
                  defaultValueNumeric: 0
                  remarks: '用戶狀態,0:未激活,1:激活,-1:禁用'
              - column:
                  name: identity
                  type: int
                  # 默認值
                  defaultValueNumeric: 999
                  remarks: '用戶身份,999:管理員'
        # 通過sql語句操作數據庫
        - sql:
            sql: insert into user (username,password,state,identity) values ('admin','admin',1,999)
        # 通過sql文件操作數據庫
        - sqlFile:
            encoding: utf8
            path: db/changelog/V1.0_1__mod_bill.sql
        - tagDatabase:
            tag: V1.0_1__mod
        # 回滾語句
        - rollback:
            - delete:
                tableName: user
                where: username='admin'
            - dropTable:
                tableName: user_bill

Maven中

引入依賴

<build>
    <plugins>
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.6.3</version>
            <configuration>
              <!-- 配置文件,必須放在resource目錄下 -->
              <propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
            </configuration>
            <executions>
                <!-- 默認mvn啟動時執行更新操作 -->
                <execution>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>update</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

配置liquibase.properties

# 日志文件路徑,必須放在resource目錄下
changeLogFile=src/main/resources/liquibase/db.changelog-master.yml
# 數據庫地址
url=jdbc:mysql://localhost:3306/liquibase_mvn?useSSL=false&useUnicode=true&characterEncoding=UTF-8
# 賬號
username=root
# 密碼
password=root

編寫變更記錄ChangeSet

  1. 編寫初始數據庫腳本
databaseChangeLog:
  - changeSet:
      # 唯一id,建議使用Flayway的命名格式'V<version>[_<SEQ>][__description]'
      id: V1.0_0__init
      # 作者
      author: Cheivin
      # 描述
      comment: "初始化腳本內容,加載初始數據"
      # 啟用事物
      runInTransaction: true
      # 變更腳本
      changes:
        # 創建表格
        - createTable:
            tableName: user
            remarks: '用戶表'
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: username
                  type: VARCHAR(50)
                  constraints:
                    nullable: false
                  remarks: '用戶名'
              - column:
                  name: password
                  type: VARCHAR(50)
                  constraints:
                    nullable: false
                  remarks: '密碼'
        # 加載數據
        - loadData:
            tableName: user
            columns:
              - column:
                  header: username
                  name: username
              - column:
                  header: password
                  name: password
            encoding: UTF-8
            file: src/main/resources/liquibase/data/init-data.csv
        # 標記,用於回滾時指定版本
        - tagDatabase:
            tag: V1.0_0__init
  1. 運行項目后,查看數據庫
  2. 修改changelog,增加變更數據庫腳本
# 在databaseChangeLog后追加
  - changeSet:
      id: V1.0_1__mod
      author: Cheivin
      comment: "修改用戶表,增加賬單表"
      runInTransaction: true
      changes:
        # 通過標准格式添加字段
        - addColumn:
            # 目標表
            tableName: user
            columns:
              - column:
                  name: state
                  type: tinyint
                  # 默認值
                  defaultValueNumeric: 0
                  remarks: '用戶狀態,0:未激活,1:激活,-1:禁用'
              - column:
                  name: identity
                  type: int
                  # 默認值
                  defaultValueNumeric: 999
                  remarks: '用戶身份,999:管理員'
        # 通過sql語句操作數據庫
        - sql:
            sql: insert into user (username,password,state,identity) values ('admin','admin',1,999)
        # 通過sql文件操作數據庫
        - sqlFile:
            encoding: utf8
            path: src/main/resources/liquibase/V1.0_1__mod_bill.sql
        - tagDatabase:
            tag: V1.0_1__mod
        # 回滾語句
        - rollback:
            - delete:
                tableName: user
                where: username='admin'
            - dropTable:
                tableName: user_bill

版本回滾

回滾指定次數

命令格式

mvn liquibase:rollback -Dliquibase.rollbackCount=次數

eg:

mvn liquibase:rollback -Dliquibase.rollbackCount=1

回滾到指定tag

命令格式

mvn liquibase:rollback -Dliquibase.rollbackTag=tag名稱

eg:

mvn liquibase:rollback -Dliquibase.rollbackTag=V1.0_0__init

輸出回滾語句

命令格式

mvn liquibase:rollbackSQL -Dliquibase.rollbackCount=次數

mvn liquibase:rollbackSQL -Dliquibase.rollbackTag=tag名稱


將會在target/liquibase目錄中生成migrate.sql文件

輸出變更記錄

命令格式

mvn liquibase:dbDoc

將會在target/liquibase目錄中生成dbDoc目錄,打開index.html可查看

一些規范

ChangeSet id建議使用Flayway的命名格式V<version>[_<SEQ>][__description],如V1.0_0__init。或使用[任務ID]-[日期]-[序號],如T100-20190705-001
ChangeSet必須填寫author
Liquibase禁止對業務數據進行sql操作
所有表,列要加remarks進行注釋
已經執行過的ChangeSet嚴禁修改。
不要隨便升級項目liquibase版本,特別是大版本升級。不同版本ChangeSet MD5SUM的算法不一樣。
參考資料

官方文檔 http://www.liquibase.org/documentation/
changeset配置文檔 http://www.liquibase.org/documentation/changes/index.html
————————————————
版權聲明:本文為CSDN博主「Cheivin」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhao0416/article/details/94733610

 

 

 

 

 

 

 

 

 

 

 

 

 


————————————————
版權聲明:本文為CSDN博主「Cheivin」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhao0416/article/details/94733610


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM