Liquibase是个开源框架,能有效管理每次开发数据库变更,但他并不会对你的数据库做检查,仅仅通过你配置文件中的脚本来检验是否条件成立,然后再执行相关语句,达到同步的目的。
另外,它会在初次启动时,生成两张表:DATABASECHANGELOG, DATABASECHANGELOGLOCK来保存每次更新的记录用于比对。
它支持多种数据库,不过你在配置SQL语句时要写正确,不能多种数据库混用,特定数据库字段类型用xml配置时也要符合该数据库规范。
1、加入依赖包
在父工程pom中加入依赖版本,如下:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>3.6.3</version>
</dependency>
2、application.yml配置
spring:
liquibase:
enabled: true
change-log: "classpath:/changelog/db.changelog-master.yaml"
3、db.changelog-master.yaml内容
databaseChangeLog:
- include:
file: changelog/eps/mysql-ddl-init.xml
- include:
file: changelog/eps/mysql-dml-change.xml
其实,里面包含的文件可以任意组合,但必须统一要求,如:每个文件要放哪些内容,或者多个文件如何命名等。
4、具体SQL配置文件内容,mysql-ddl-init.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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.6.xsd">
<!--gg_ai_status表-->
<changeSet author="shikeying" id="20200522-demo-update-1">
<preConditions>
<not>
<columnExists tableName="gg_ai_status" columnName="summary"></columnExists>
</not>
</preConditions>
<addColumn tableName="gg_ai_status">
<column name="summary" type="varchar(255)"/>
</addColumn>
<comment>更新原有表的字段</comment>
</changeSet>
<changeSet author="shikeying" id="20200522-demo-insert-1">
<preConditions>
<not>
<tableExists tableName="test_liquibase"></tableExists>
</not>
</preConditions>
<createTable tableName="test_liquibase" remarks="表不存在(新建)">
<column name="id" type="bigint" remarks="主键">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_test_li_id"/>
</column>
<column name="name" type="varchar(200)" remarks="名字" defaultValue="">
<constraints nullable="false"/>
</column>
<column name="summary" type="text" remarks="备注">
<constraints nullable="true"/>
</column>
</createTable>
<comment>加入新表</comment>
</changeSet>
</databaseChangeLog>
5、具体SQL配置文件内容,mysql-dml-change.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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.6.xsd">
<changeSet author="shikeying" id="20200522-demo-insert-data-1">
<sql>insert into test_liquibase(id,name,summary) values(1,'shikeying','');</sql>
<sql>insert into test_liquibase(id,name,summary) values(2,'sunwukong','has_value');</sql>
</changeSet>
</databaseChangeLog>
注意要点:
1)author为作者,通常每个人会区分开来,id为更新数据集的序号,建议不要重复,设置个规则
2)每个changeSet中最好只有一个操作,或者多个同类型操作,如:写入一个表多条数据、更新一个表多个字段等
3)author和id一旦确定并且被运行过,就千万不能再修改这俩属性,因为你修改后它认为是新的内容会再次执行而导致数据重复报错,记住changeSet就是流水账,只能追加不能修改(删除也可以)。
4)如果enables:true,则每次启动都会执行变更检查,如果不需要关闭即可