一、简介
官网:http://www.liquibase.org/
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。
Liquibase具备如下特性:
- 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
- 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。
- 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。
- 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
- 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
- 可生成数据库修改文档(HTML格式)
- 提供数据重构的独立的IDE和Eclipse插件
https://blog.csdn.net/u012934325/article/details/100652805
总结: 通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。
二、springboot集成Liquibase
https://blog.csdn.net/weixin_41404773/article/details/106355563
1、引入依赖
<!--Liquibase-->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
2、配置Springliquibasebean
@Configuration public class LiquibaseConfig { @Bean public SpringLiquibase liquibase(DataSource dataSource) { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); //指定changelog的位置,这里使用的一个master文件引用其他文件的方式 liquibase.setChangeLog("classpath:liquibase/master.xml"); liquibase.setContexts("development,test,production"); liquibase.setShouldRun(true); return liquibase; } }
3、在resorces中添加liquibase文件夹,然后创建changelog文件夹,在changeelog文件创建xml文件
20210805-table01.xml这个xml文件是针对数据库的操作
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="20210805-01" author="test"> <createTable tableName="dh_project_category" remarks="项目类型表"> <column name="id" type="varchar(64)" remarks="项目类型id"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(255)" remarks="类目类型名称"/> <column name="status" type="int(11)" remarks="状态。1正常,2删除"/> <column name="remark" type="varchar(255)" remarks="备注"/> </createTable> </changeSet> </databaseChangeLog>
Id:唯一id
Author:修改人
4、在resources中的liquibase文件夹下创建master.xml文件夹,可以将ChangeSet分布在不同文件中。同时<include/>支持多级引用。
基于此功能可以对项目中的ChangeSet进行有效管理。推荐使用以下规范进行管理。
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- 1:includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。 2:includeAll 标签里有两个属性:path 和 relativeToChangelogFile。 2.1:path (在 include 标签里是 file):指定要加载的文件或文件夹位置 2.2:relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。 --> <includeAll path="liquibase/changelog/" relativeToChangelogFile="false"/> </databaseChangeLog>
5、点击启动项目:初始化liquibase的配置,启动项目会默认生成两个表
---databasechangelog:记录的是每一次表修改的记录,里面会详细记录操作的类型和操作
---databasechangeloglock: 表用于确保两台计算机不会同时尝试修改数据库。
dh_project_category:这个是刚刚自动生成的表
三、liquibase常用操作
通过上面的文档介绍,我们已经知道了liquibase与springboot的集成,并且已经知道,通过master.xml对changelog文件的统一管理,我们可以支持多个不同的changelog的配置和运行,并且已经知道,changlog主要是对数据库的各自操作,接下来,主要介绍的是changelog对数据库的操作方式
1、创建表
<changeSet id="20190713-01" author="solo">
<createTable tableName="project_info">
<column name="project_id" type="varchar(64)" encoding="utf8" remarks="项目id">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="project_name" type="varchar(255)" encoding="utf8" remarks="项目名字"/>
</createTable>
</changeSet>
<createTable>表是创建表 tableName 表明
<column> 字段标签,
name:字段名称
type:字段类型
encoding:编码类型
remarks:字段注释
<constraints> 主键标签
primaryKey:是否主键
Nullable:是否为空
2、修改表-添加列
<changeSet id="20190713-01" author="yunshan">
<addColumn tableName="project_info">
<column name="address" type="varchar(255)" encoding="utf8" remarks="地址"/>
</addColumn>
</changeSet>
<addColumn> tableName 修改表名
<column> 字段标签,
name:字段名称
type:字段类型
a:同一个文件中,changeSet中的id不能重复,
b: 每次数据库变更,都会在databasechangelog生成一条记录
3、修改表-删除列
<changeSet id="20190713-03" author="yunshan">
<dropColumn tableName="project_info" columnName="address"/>
</changeSet>
4、修改表-插入数据
<changeSet id="20190713-061" author="yunshan">
<insert tableName="project_info">
<column name="project_id" valueNumeric="312223"/>
<column name="project_status" valueNumeric="322434343"/>
<column name="project_name" value="wkn"/>
</insert>
</changeSet>
<inSert>数据插入标签
<column> 字段标签,
name:字段名称
valueNumeric:对应的字符值
5、修改表-通过sql脚本
<changeSet id="20200522-02" author="yunshan">
<sqlFile path="liquibase/sql/project_info.sql"/>
</changeSet>
<sqlFile>标签,指定需要加载的sql路径