项目更新或升级时,总会因为缺失数据库字段导致部分功能无法正常使用。
liquibase可以很好的解决这个问题。网上对于其使用有很多例子,但我更喜欢的还是根据sql文件来记录变更。

一、引入依赖

1
2
3
4
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

二、文件配置

2.1 spring配置

1
2
3
4
spring:
liquibase:
enabled: true
change-log: sql/changelog.yml
  • enabled 属性设置为true
  • change-log 属性设置sql变更的配置文件

2.2 change-log文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
databaseChangeLog:
- changeSet:
id: init
author: zhangyuliang
comment: 初始化
changes:
- sqlFile:
splitStatements: true
stripComments: false
path: sql/init.sql
- tagDatabase:
tag: 1.0.0
- changeSet:
id: init.data
author: zhangyuliang
comment: 初始化数据
changes:
- sqlFile:
splitStatements: true
stripComments: false
path: sql/init.data.sql
- tagDatabase:
tag: 1.0.0

2.3 change-log文件及sql文件在项目中的展示

本地图片

三、sql执行

liquibase开启后,会在项目启动的时候执行,注意sql文件不要报错,否则会启动失败。
另外,sql文件建立后千万不要修改文件,否则liquibase会认为是相同id的sql变更,会重新执行,而 changeSet 的id相同会执行失败,导致启动失败。
建议以追加sql文件的形式来进行数据库变更,任何字段的修改都遵循这一原则,这样即使不同版本的项目进行更新时,都能根据 changeSet 补全sql变更。

本地图片

sql执行成功后,数据库会多两张表,DATABASECHANGELOGDATABASECHANGELOGLOCK
DATABASECHANGELOG表里记录了sql的变更日志。
如果确实要修改sql文件,则需要在数据库里删除 ID = changeSet 的记录。