Liquibase:跟踪,版本化和部署数据库更改
(官网https://www.liquibase.org/ 文档 https://docs.liquibase.com/home.html)
1.概述:
Liquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在xml/sql文件中,便于版本控制。
2.基本概念:
变更集(changesets) 变更集是Liquibase跟踪执行变化的单位。每个changeSet由author,id和filename属性唯一标识。当Liquibase运行时,它会查询DATABASECHANGELOG表里标记为已执行的changeSet,然后执行changelog里尚未执行的changeSet。
变更类型(Change types) 变更类型描述了一种修改类型或者数据库操作,每个变更集包含一种多多种变更类型。liquibase为已支持的数据库提供了对应sql的描述性变更类型和原始sql,一般情况下一个变更集里只配置一个变更类型,避免自动提交失败时发生意外情况。例如createTable就是一种变更类型。
前提条件(Preconditions)前提条件可以配置在整个changelog文件里也可以配再单独的的changeSet里。在更新操作之前先判断数据库的状态,做出相应的操作。例如
语境(Contexts)在变更集中设置context使该变更只运行在对应环境中,例如设置production或test,如果不设置环境,则该变更会运行在所有环境中。
标签(Labels)类似于context,也是用于控制change何时被执行,和context搭配使用效果更佳。
3.使用
Download(https://www.liquibase.org/download)
在工作目录里配置liquibase.properties,sample.changelog.xml,启动数据库(示例使用H2,H2的数据存储在内存中,重启会恢复到初始状态)
执行命令 liquibase update
可以看到COMPANY和PERSON表已经被创建出来了,DATABASECHANGELOG和DATABASECHANGELOGLOCK是liquibase创建的表。DATABASECHANGELOG用来记录哪些changeset已经被执行了,使用DATABASECHANGELOGLOCK确保同时只有一个liquibase实例在执行。
也可以执行远程操作,命令 liquibase --url=jdbc:h2:tcp://localhost:9090/mem:integration update ,--url parameter参数会覆盖liquibase.properties文件中的url参数,其他参数还是使用配置文件中的。
liquibase status --verbose (或liquibase --url=jdbc:h2:tcp://localhost:9090/mem:integration status --verbose)查看是否有changeset尚未被执行
liquibase updatesql (或liquibase --url=jdbc:h2:tcp://localhost:9090/mem:integration updateSQL) 查看更新changeset的sql语句
liquibase diff (或liquibase --referenceUrl=jdbc:h2:tcp://localhost:9090/mem:integration --referenceUsername dbuser --referencePassword letmein diff)比较数据库内容的差别
4.liquibase和springboot结合
引入依赖
配置类
目录结构
master.xml
includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。
includeAll 标签里有两个属性:path 和 relativeToChangelogFile。
path (在 include 标签里是 file):指定要加载的文件或文件夹位置
relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。
changelog
如果项目一开始就用了 liquibase,那可以像上面这样写,把建表语句都写在 changelog 里。
如果一开始没用,后期想引入 liquibase,可以把以前的数据库导出成 sql,然后引入 sql 文件。
<include file="liquibase/changelogs/project.sql" relativeToChangelogFile="false"/>
application.yml
启动项目,自动执行changeset更新
5.由jpa entities 生成changelog
执行mvnw liquibase:diff命令
新的changelog文件20200518024017_changelog.xml会生成到src/main/resources/config/liquibase/changelog目录
将生成的changelog追加到src/main/resources/config/liquibase/master.xml里,下次启动Application会应用更改到数据库。