SpringBoot集成liquibase案例

前言

项目中版本发布需要做一个版本管理工具,项目使用 SpringBoot 框架。

目前有两款 liquibaseflyway

flyway不支持并发,也就是集群项目会执行多次,进而否掉。

Liquibase

  • 支持执行锁、回滚;
  • 支持MySQL, PostgreSQL, Oracle, Sql Server等;
  • 支持多开发者(每个脚本必须写 author );
  • 多种运行方式:命令行、Spring集成、Maven插件等

官网

Liquibase文件结构:

1
2
3
4
5
6
7
8
9
10
databaseChangeLog
├── createTable
| ├── column
| ├── ...
| └── remarks
├── createView
| ├── ...
| └── viewName
├── ...
└── sqlFile

Liquibase使用

Maven引入

1
2
3
4
5
6

<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.6.0</version>
</dependency>

配置

application.yml 文件配置

1
2
3
4
5
6
7
8
9
10
11
12
spring:
liquibase:
# 开启(默认true)
enabled: true
# 文件路径
change-log: classpath:/liquibase/change_log/Init_table.xml
# 是否先删除数据库模式(默认 false)
drop-first: false
# 版本记录表名
database-change-log-table: DATABASECHANGELOG
# 版本记录执行锁
database-change-log-lock-table: DATABASECHANGELOGLOCK

Init_table.xml 文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<changeSet id="V0.0.1-20211017-001" author="maxzhao">
<createTable tableName="a_demo_user" remarks="用户表">
<column name="id" type="bigint" remarks="用户主键">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_a_demo_user_id"/>
</column>
<column name="username" type="varchar(100)" remarks="用户名">
<constraints nullable="false"/>
</column>
<column name="password" type="varchar(100)" remarks="密码">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
<!--<changeSet id="V0.0.1-20211017-001" author="maxzhao">-->
<!-- SQL 文件的方式,不推荐,不能兼容不同数据库 -->
<!--<sqlFile path="test.sql"/>-->
<!--</changeSet>-->
<!-- 加载其它文件 -->
<!--<include file=""/>-->
</databaseChangeLog>

注意:

  • ID是唯一的,是存储数据库中判断 ChangeSet 是否执行的重要依据
  • SQL 脚本文件不应该包含 schema 名称
  • 表、字段需要添加 remarks 注释
  • 已经执行的 changeSet 禁止修改,启动会报错。
  • 不要随便升级版本,特别是大版本。不同版本的 CHangeSet MD5SUM 算法很可能不一样。
  • 不要添加业务数据的修改,可能换个项目就不能用了。

生成已存在表结构

1
2
3
4
# 生成表结构
liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.26.jar --changeLogFile=./dbchangelog.xml --url="jdbc:mysql://localhost:3306/blog" --username=root --password=root generateChangeLog
# 生成表数据
liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.26.jar --changeLogFile=./dbchangelog.xml --url="jdbc:mysql://localhost:3306/blog" --username=root --password=root --diffTypes=data generateChangeLog

本文地址: https://github.com/maxzhao-it/blog/post/cf860b21/