众所周知,使用git管理代码可以使得多人协作、版本管理等工作变得异常轻松。但数据库表结构的管理却一直没有很好的解决方案,比如每次变更数据库都要手动执行SQL脚本,不同版本的程序和不同版本的数据库表结构要小心的匹配,跨数据库平台的还需为不同数据库准备不同SQL脚本,数据库表结构只能升级、不能降级。
Liquibase允许使用SQL、XML、JSON、YAML文件格式。SpringBoot默认使用YAML文件格式,这里以YAML格式为例进行说明。
如要为person表增加country列,通常SQL代码为:
ALTER TABLE person ADD country varchar(2)
,在Liquibase中则描述为:
- changeSet:
id: 4
author: your.name
changes:
- addColumn:
tableName: person
columns:
- column:
name: country
type: varchar(2)
其中
id
是该changeSet的唯一标识,
author
则标记该changeSet是谁编写的。
Liquibase可以根据此描述,为不同数据库生成不同SQL代码。并且会在数据库中自动创建
DATABASECHANGELOG
表,用于记录哪些
changeSet
是执行过的。
由此可知Liquibase的原理还是很简单的。
参考资料
:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
默认的yaml文件位于
src/main/resources/
db/changelog/db.changelog-master.yaml
,可以直接在这个文件上写入Liquibase代码。
但最佳实践是将不同版本的changelog放在独立的文件。例如
1.0
版本的changelog为
db.changelog-1.0.yaml
,
2.0
版本的chagelog为
db.changelog-2.0.yaml
。在
db.changelog-master.yaml
将其包含进来。
databaseChangeLog:
- include:
file: db.changelog-1.0.yaml
relativeToChangelogFile: true
- include:
file: db.changelog-2.0.yaml
relativeToChangelogFile: true
完成SpringBoot的配置之后,程序启动时就会解析
db.changelog-master.yaml
文件的内容,并和Liquibase自动创建的
DATABASECHANGELOG
表的内容进行比对,没有执行的changelog会根据当前数据库类型生成相应的SQL自动执行,并写入
DATABASECHANGELOG
。
需要注意的是,Liquibase并不会对表结构自动回滚。比如git从2.0版本切换到1.0版本,数据库结构不会自动回滚到1.0版本。因为数据库结构回滚可能会删表(表里的数据也就没了),是风险极大的操作。Liquebase支持数据库结构回滚,给不同版本的数据库结构做
tag
标记,可回滚到某个标记处。对于某些Liquibase无法自动生成回滚语句的(比如insert、update语句),需要自己在changelog编写回滚语句。这些是高级用法,且用的极少,这里就不多做介绍。