小试牛刀-LiQuiBase

小试牛刀-LiQuiBase

文章目录

  • 小试牛刀-LiQuiBase
    • 前言
    • 一、引入依赖
    • 二、 更新配置文件
    • 三、新增changelog
      • 1. Change Types
        • [1]. 示例:使用`- createTable`方式创建数据表
        • [2]. 示例:通过 `sqlFile`方式创建数据表
        • [3]. 其他 Change Types

前言

liquibase是一个数据库变更的版本控制,重构和迁移的开源工具。项目中通过liquibase日志文件的形式解析通过记录数据库的变更,生成sql语句,并执行和记录,将数据库更新或回滚到一致的状态。执行是根据记录确定sql语句是否曾经执行过,和配置文件里的预判断语句确定sql是否执行。
它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。其优点主要有以下:

  • 支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
  • 支持多开发者的协作维护;
  • 版本控制按序执行;
  • 可回滚,可重复执行迁移;
  • 日志文件支持多种格式,如XML, YAML, JSON, SQL等;
  • 支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等。

本文引入maven依赖,规定版本4.9.1

官网:Liquibase | Open Source Version Control for Your Database

技术文档:Liquibase Online Documentation

一、引入依赖

最新版本:4.16.0 更新时间2022.09.09

<dependency>
    <groupId>org.liquibasegroupId>
    <artifactId>liquibase-coreartifactId>
    <version>4.9.1version>
dependency>

二、 更新配置文件

文件层级:

小试牛刀-LiQuiBase_第1张图片

配置文件:

spring:
  datasource:
    # MySql
    url: jdbc:mysql://localhost:33066/bladex_boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
    username: root
    password: 4Pt2lUUScy
  liquibase:
    enabled: true
    # 如下配置是被spring.datasource赋值的,所以可以不配置
    #    url: jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8
    #    user: root
    #    password: bfXa4Pt2lUUScy8jakXf
    change-log: classpath:/db/changelog/db.changelog-master.yaml

三、新增changelog

1. Change Types

[1]. 示例:使用- createTable方式创建数据表

通过- createTable 属性创建数据表,表中每个字段通过- column属性添加字段,其- column字段各属性如下贴图所示 。

databaseChangeLog:
    - changeSet:
          id: 20221012-01
          author: chuci
          changes:
              - createTable:
                    catalogName: bladex_boot
                    tableName: test-table
                    remarks: 测试数据表
                    schemaName: public
                    tablespace: 测试tablespace
                    columns:
                        - column:
                              name: id
                              type: int
                              autoIncrement: true
                              constraints:
                                  primaryKey: true
                                  nullable: false
                        - column:
                              name: firstname
                              type: varchar(50)
                              remarks: 姓氏
                        - column:
                              name: lastname
                              type: varchar(50)
                              remarks: 名字
                              constraints:
                                  nullable: false
                        - column:
                              name: state
                              type: char(2)
                        - column:
                              name: create_time
                              type: datetime

字段column属性:column | Liquibase Docs

小试牛刀-LiQuiBase_第2张图片

小试牛刀-LiQuiBase_第3张图片

小试牛刀-LiQuiBase_第4张图片

[2]. 示例:通过 sqlFile方式创建数据表

使用 - sqlFile属性,通过读取.sql文件来执行SQL语句创建数据库sqlFile | Liquibase Docs

databaseChangeLog:
    - changeSet:
          id: 20221013-01
          author: chuci-sqlFile
          changes:
              - sqlFile:
                    # 指定数据库类型,使用 ‘,’进行分割
                    dbms: '!h2,oracle,mysql'
                    # 指定在属性中定义的文件中使用的编码
                    encoding: UTF-8
                    # 指定结束 SQL 语句的字符。
                    endDelimiter: ;
                    # Set to false to not have Liquibase split statements on and . Defaults to true if not set.
                    splitStatements: true
                    # 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
                    relativeToChangelogFile: true
                    # 指定要加载的 SQL 文件的文件路径。
                    path: ../sql/wyTestCreateNameTable.sql
                    # 设置relativeToChangelogFile: false 时候指定从绝对路径
                    # path: classpath:/db/sql/wyTestCreateNameTable.sql
                    # 设置为 在执行之前删除 SQL 中的任何注释。
                    stripComments: true
CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(50) DEFAULT NULL COMMENT '姓氏',
  `lastname` varchar(50) DEFAULT NULL COMMENT '名字',
  `state` char(2) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试数据表';
[3]. 其他 Change Types

不仅仅是createTable, 还包括其他

小试牛刀-LiQuiBase_第5张图片

不仅仅可以读取.sql文件来执行SQL语句,同时也支持直接执行SQL语句:sql | Liquibase Docs

databaseChangeLog:
    - changeSet:
          id: sql-example
          author: liquibase-docs
          changes:
              - sql:
                    dbms: '!h2,oracle,mysql'
                    endDelimiter: \nGO
                    splitStatements: true
                    sql: INSERT INTO `bladex_boot`.`wy-test2` (`firstname`, `lastname`, `state`, `create_time`) VALUES ('first', 'last', '1', '2022-10-13 15:40:10');
                    stripComments: true
          comment: What about Bob?

在这里插入图片描述

小试牛刀-LiQuiBase_第6张图片

最后的最后~,操作异常也可以通过rollback来进行回滚。

小试牛刀-LiQuiBase_第7张图片


最后附上完整测试yaml文件

databaseChangeLog:
    - changeSet:
          id: 20221012-01
          author: chuci
          changes:
              - createTable:
                    catalogName: bladex_boot
                    tableName: wy-test2
                    remarks: 测试数据表
                    schemaName: public
                    tablespace: 测试tablespace
                    columns:
                        - column:
                              name: id
                              type: int
                              autoIncrement: true
                              constraints:
                                  primaryKey: true
                                  nullable: false
                        - column:
                              name: firstname
                              type: varchar(50)
                              remarks: 姓氏
                        - column:
                              name: lastname
                              type: varchar(50)
                              remarks: 名字
                              constraints:
                                  nullable: false
                        - column:
                              name: state
                              type: char(2)
                        - column:
                              name: create_time
                              type: datetime
    - changeSet:
          id: 20221012-02
          author: chuci
          changes:
              - addLookupTable:
                    existingTableName: wy-test2
                    existingColumnName: state
                    newTableName: state-test
                    newColumnName: id
                    newColumnDataType: char(2)

    - changeSet:
          id: 20221013-01
          author: chuci-sqlFile
          changes:
              - sqlFile:
                    # 指定数据库类型,使用 ‘,’进行分割
                    dbms: '!h2,oracle,mysql'
                    # 指定在属性中定义的文件中使用的编码
                    encoding: UTF-8
                    # 指定结束 SQL 语句的字符。
                    endDelimiter: ;
                    # Set to false to not have Liquibase split statements on and . Defaults to true if not set.
                    splitStatements: true
                    # 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
                    relativeToChangelogFile: true
                    # 指定要加载的 SQL 文件的文件路径。
                    path: ../sql/wyTestCreateNameTable.sql
                    # 设置为 在执行之前删除 SQL 中的任何注释。
                    stripComments: true

    - changeSet:
          id: 20221013-04
          author: chuci-sqlFile
          changes:
              - sqlFile:
                    # 指定数据库类型,使用 ‘,’进行分割
                    dbms: '!h2,oracle,mysql'
                    # 指定在属性中定义的文件中使用的编码
                    encoding: UTF-8
                    # 指定结束 SQL 语句的字符。
                    endDelimiter: ;
                    # Set to false to not have Liquibase split statements on and . Defaults to true if not set.
                    splitStatements: true
                    # 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
                    relativeToChangelogFile: false
                    # 指定要加载的 SQL 文件的文件路径。
                    path: classpath:/db/sql/wyTestCreateNameTable.sql
                    # 设置为 在执行之前删除 SQL 中的任何注释。
                    stripComments: true

    - changeSet:
          id: sql-example
          author: liquibase-docs
          changes:
              - sql:
                    dbms: '!h2,oracle,mysql'
                    endDelimiter: \nGO
                    splitStatements: true
                    sql: INSERT INTO `bladex_boot`.`wy-test2` (`firstname`, `lastname`, `state`, `create_time`) VALUES ('first', 'last', '1', '2022-10-13 15:40:10');
                    stripComments: true
          comment: What about Bob?


至此,本节完~~~

上一节:
下一节:

此系列以完整记录自己在 J a v a 学习路的过程 此系列以完整记录自己在Java学习路的过程 此系列以完整记录自己在Java学习路的过程

你可能感兴趣的:(杂记,学习,数据库,mysql,后端,其他)