为什么选择 liquibase
虽然 github 上,flyway 对比 liquibase,在 star 上有一定领先(2018-10-10 19:07:14 星期三),但是 liquibase 有如下优点:
- 跨数据库的类型,不管是 mysql/oracle/mssql 等都支持
- 多文件格式支持,
xml/yaml/json/groovy
等等都可以
从新开发软件到版本迭代可能会遇到的问题
- 新版本开发过程中,开发人员的数据库变更如何更准确地反应到提交的文件中。(比如,A 在开发过程中添加了一个忘记写变动脚本的字段)
- 某些预设的系统配置,没有设置的时候可能会出现错误。
- 版本迭代的时候,老版本的数据库结构和数据的处理。
这些问题在使用 liquibase 后都能得到解决。
如何用 liquibase 解决这些问题
使用场景: springboot@2.0.5 + mysql@8.0.12 + gradle@4.10 + liquibase@3.6.2 + liquibase-gradle-plugin@2.0.1
步骤如下:
-
gradle 引入 liquibase/liquibase-gradle-plugin
// build.gradle in rootProject buildscript { ... dependencies { classpath "gradle.plugin.org.liquibase:liquibase-gradle-plugin:${liquibasePluginVersion}" } }
-
在模块内的
build.gradle
导入插件,并添加对应依赖。()// build.gradle in module using liquibase apply plugin: 'org.liquibase.gradle' dependencies { liquibaseRuntime 'org.liquibase:liquibase-core' liquibaseRuntime 'mysql:mysql-connector-java' }
-
springboot 配置,包含初始化脚本,以及 liquibase 配置。全部使用默认配置也是可以的
-
配置 liquibase,主要是各种情况下的不同配置
liquibase { activities { dev { changeLogFile 'src/main/resources/db/changelog/db.changelog-auto.xml' url 'jdbc:mysql://127.0.0.1:3306/db_dev?serverTimezone=UTC&useSSL=false' username 'root' password 'root' referenceUrl 'jdbc:mysql://127.0.0.1:3306/db_test?serverTimezone=UTC&useSSL=false' referenceUsername 'root' referencePassword 'root' } data { changeLogFile 'src/main/resources/db/changelog/db.changelog-data.xml' url 'jdbc:mysql://127.0.0.1:3306/db_dev?serverTimezone=UTC&useSSL=false' username 'root' password 'root' diffTypes 'data' } ... } runList = System.getProperty("runList") ?: 'dev,data' }
-
变动日志文件
// db.changelog-master.yaml databaseChangeLog: - include: file: db.changelog-auto.xml relativeToChangelogFile: true - include: file: db.changelog-data.xml relativeToChangelogFile: true
-
配置及文件说明
liquibase.activities
下的配置主要是配置各种情况下使用不同日志变动文件及相关配置项。dev
是最常用的,用来比较开发库和测试库的区别,以此来生成数据库变动data
用来生成数据库内数据。liquibase 文档要求生成数据有且只能用generateChangeLog
命令来实现,diff
等都不能做到导出数据要求。- 如果有导入初始化数据的需求的情况,可以添加
init
配置,用来导入初始化文件。初始化文件既可以是 sql 文件,也可以是 liquibase 能够识别正常导入的配置文件。 - 如果有手动添加的需求,可以添加
sql
配置,用来指向到当前开发库。 - 所有添加的
activities
下的配置都将对应一个db.changelog
文件。为了能够让 liquibase 下status
任务能够识别和统计到,这些文件都需要在db.changelog-master.yaml
中被include
。
-
常见情况下如何使用
task
dropAll
删除所有表,包括 liquibase 用到databasechangelog
等库。status
统计master
文件内包含的activities
中所有没有应用到的更新。update
更新master
文件内能够统计到的没有应用到的更新。- 如果
spring.datasource.initialization-mode=never
,添加init
配置,db.changelog
文件下changeSet
添加 sql 文件,设置runList='init'
完成初始化。(使用spring.datasource.initialization-mode=always
+spring.datasource.continue-on-error=true
也能实现类似的,不过只能执行 sql 文件,开发环境 liquibase 的实现可能更快捷)
注意事项:
liquibase-gralde-plugin
在2.0.0
之后,添加了配置liquibaseRuntime
,用来配置依赖,减少插件内部的依赖项。同时要求 liquibase 版本> 3.4.2
- 项目中使用了
io.spring.dependency-management
插件,没有显示配置依赖版本了。 - mysql 8 在连接字符串上配置有
serverTimezone