liquibase 使用

为什么选择 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-plugin2.0.0 之后,添加了配置 liquibaseRuntime,用来配置依赖,减少插件内部的依赖项。同时要求 liquibase 版本 > 3.4.2
  • 项目中使用了 io.spring.dependency-management 插件,没有显示配置依赖版本了。
  • mysql 8 在连接字符串上配置有 serverTimezone

转载于:https://my.oschina.net/kostark/blog/2240520

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值