一、Liquibase简介
-
LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。
-
支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
-
支持多开发者的协作维护;
-
日志文件支持多种格式,如XML, YAML, JSON, SQL等;
-
支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等;
二、liquibase常用标签介绍
changeSet:用于单次执行的最大单元,表操作都应在该标签里面
| 属性 | 解释 | 示列值 |
|---|---|---|
| id | 修改项的唯一标识,不可以重复,一般按 表名_年月日_自增id | ts_sys_code_20230621_01 |
| author | 作者 |
<changeSet id="ts_file_01" author="chengpengai">
<createTable tableName="ts_file" remarks="系统文件表">
<column name="id" type="varchar(32)" remarks="主键ID">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="file_no" type="varchar(50)" remarks="文件编号"/>
</createTable>
</changeSet>
<changeSet id="ts_sys_code_20230424_01" author="chengpengai">
<sql>
INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目阶段', 'PROJECT_STAGE', 'BUSINESS_STAGE', '商务阶段', NULL, 1, 1, 0, b'0', '', NULL, NOW(), NULL, '');
</sql>
</changeSet>
........
createTable: 创建表
| 属性 | 解释 | 示列值 |
|---|---|---|
| tableName | 表名称 | |
| remarks | 表注释 |
<changeSet id="ts_file_01" author="chengpengai">
<createTable tableName="ts_file" remarks="系统文件表">
<column name="id" type="varchar(32)" remarks="主键ID">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="file_no" type="varchar(50)" remarks="文件编号"/>
<column name="file_name" type="varchar(100)" remarks="文件名称"/>
<column name="file_path" type="varchar(255)" remarks="文件相对路径"/>
<column name="file_suffix_type" type="varchar(20)" remarks="文件后缀类型"/>
<column name="file_upload_type" type="char(2)" remarks="文件上传指定类型(0:图片 1:音频 2:视频 3:文档 4:安装包 9:其他)"/>
<column name="file_size" type="varchar(50)" remarks="文件大小"/>
<!-- 表标准字段 -->
<column name="version" type="int" defaultValueNumeric="0" remarks="版本">
<constraints nullable="false"/>
</column>
<column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
<constraints nullable="false"/>
</column>
<column name="creator" type="varchar(32)" defaultValue="" remarks="创建人ID"/>
<column name="create_time" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" remarks="创建时间">
<constraints nullable="false"/>
</column>
<column name="updater" type="varchar(32)" remarks="更新人ID"/>
<column name="update_time" type="datetime" remarks="更新时间"/>
<column name="comments" type="varchar(255)" remarks="备注"/>
<!-- 表标准字段 -->
</createTable>
</changeSet>
addColumn:添加表字段
<changeSet id="tb_project_info_20230417_01" author="chengpengai">
<addColumn tableName="tb_project_info">
<column name="total_cost" type="float" remarks="项目总费用" afterColumn="init_man_hour"/>
</addColumn>
</changeSet>
modifyDataType:修改表字段类型
<changeSet id="tb_project_info_20230417_02" author="chengpengai">
<modifyDataType tableName="tb_project_info" columnName="init_man_hour" newDataType="float"/>
</changeSet>
dropColumn:删除表字段
<changeSet id="tb_project_info_20230516_02" author="chengpengai">
<dropColumn tableName="tb_project_info" columnName="total_cost"/>
</changeSet>
column:字段信息
| 属性 | 解释 | 示列值 |
|---|---|---|
| name | 字段名称 | |
| type | 字段类型 | |
| remarks | 字段描述 | |
| defaultValue | 字符类型 默认值 | |
| defaultValueNumeric | 数值类型 默认值 | |
| defaultValueDate | 日期类型 默认值 | |
| defaultValueBoolean | 布尔类型 默认值 | |
| autoIncrement | 自动递增 | 1 |
<column name="id" type="varchar(32)" remarks="主键ID">
<!-- 创建主键索引 -->
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="project_no" type="varchar(50)" remarks="项目编号" defaultValue=""/>
<column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
<!-- 声明该字段不能为空 -->
<constraints nullable="false"/>
</column>
createIndex:创建索引
| 属性 | 解释 | 示列值 |
|---|---|---|
| tableName | 表名称 | |
| indexName | 索引名称 | |
| unique | 唯一索引 | true/fasle |
| clustered | 聚合索引 | true/false |
<!-- 普通索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name">
<column name="name"/>
</createIndex>
<!-- 唯一索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name" unique="true" >
<column name="name"/>
</createIndex>
<!-- 聚合索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name" clustered="true">
<column name="name"/>
<column name="age“/>
</createIndex>
三、用法
SpringBoot集成Liquibase
1. 引入maven坐标 / 引入gradle坐标
<!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.0.0</version>
</dependency>
// https://mvnrepository.com/artifact/org.liquibase/liquibase-core
implementation group: 'org.liquibase', name: 'liquibase-core', version: '4.0.0'
2.目录结构
3.相关配置文件添加
添加表的操作日志文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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.3.xsd">
<changeSet id="ts_sys_code_01" author="chengpengai">
<!--创建表-->
<createTable tableName="ts_sys_code" remarks="系统字典表">
<column name="id" type="varchar(32)" remarks="主键ID">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="type" type="varchar(50)" remarks="类型"/>
<column name="type_e" type="varchar(50)" remarks="类型英文名称"/>
<column name="code" type="varchar(50)" remarks="编码"/>
<column name="val" type="varchar(50)" remarks="编码值"/>
<column name="parent_code" type="varchar(50)" remarks="上级编码"/>
<column name="level" type="int(11)" remarks="层级"/>
<column name="sorted" type="int(11)" remarks="排序"/>
<!-- 表标准字段 -->
<column name="version" type="int" defaultValueNumeric="0" remarks="版本">
<constraints nullable="false"/>
</column>
<column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
<constraints nullable="false"/>
</column>
<column name="creator" type="varchar(32)" defaultValue="" remarks="创建人ID"/>
<column name="create_time" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" remarks="创建时间">
<constraints nullable="false"/>
</column>
<column name="updater" type="varchar(32)" remarks="更新人ID"/>
<column name="update_time" type="datetime" remarks="更新时间"/>
<column name="comments" type="varchar(255)" remarks="备注"/>
<!-- 表标准字段 -->
</createTable>
</changeSet>
<changeSet id="ts_sys_code_20230424_02" author="chengpengai">
<!--定义要执行的sql语句-->
<sql>
INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'ON_SCHEDULE', '按计划进行中', NULL, 1, 1, 0, b'0', '', NULL, NOW(), NULL, '');
INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'DELAYED', '计划有变/延后', NULL, 1, 2, 0, b'0', '', NULL, NOW(), NULL, '');
INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'DELAY', '进度延迟', NULL, 1, 3, 0, b'0', '', NULL, NOW(), NULL, '');
</sql>
</changeSet>
<changeSet id="ts_sys_code_20230424_03" author="chengpengai">
<!-- 添加表字段 -->
<addColumn tableName="ts_sys_code">
<column name="total_cost" type="float" remarks="项目总费用" afterColumn="level"/>
</addColumn>
</changeSet>
<changeSet id="ts_sys_code_20230417_04" author="chengpengai">
<!-- 修改数据类型 -->
<modifyDataType tableName="ts_sys_code" columnName="total_cost" newDataType="decimal(10,2)"/>
</changeSet>
<changeSet id="ts_sys_code_20230516_05" author="chengpengai">
<!--字段删除-->
<dropColumn tableName="ts_sys_code" columnName="total_cost"/>
</changeSet>
</databaseChangeLog>
添加changelog.xml(用于引入库相关操作的日志文件)
<?xml version="1.0" encoding="UTF-8"?>
<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.3.xsd">
<!-- 系统基础表 -->
<include file="classpath:liquibase/changelog/business/base/ts_sys_code.xml" relativeToChangelogFile="false"/>
<include file="classpath:liquibase/changelog/business/base/ts_file.xml" relativeToChangelogFile="false"/>
<includeAll path="classpath:liquibase/changelog/business/base" relativeToChangelogFile="false"/>
</databaseChangeLog>
4.添加liquibase配置
spring:
liquibase:
# 配置changelog.xml 文件的地址
change-log: classpath:liquibase/changelog.xml
#是否开启liqubase
enabled: true
#数据库相关配置
url: ${spring.datasource.url}
user: ${spring.datasource.username}
password: ${spring.datasource.password}