LiquiBase官网地址
LiquiBase 是一个数据库重构和迁移的开源框架,通过日志的方式来记录数据库的变更。通过执行日志文件中的修改,将数据库更新或回滚到达一致的状态。
<dependency>
<groupId>org.liquibasegroupId>
<artifactId>liquibase-coreartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.18version>
dependency>
<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.4.xsd">
<include file="classpath:/liquibase/change_log/init_table.xml" relativeToChangelogFile="false"/>
<include file="classpath:/liquibase/change_log/init_data.xml" relativeToChangelogFile="false"/>
databaseChangeLog>
1:includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。
2:includeAll 标签里有两个属性:path 和 relativeToChangelogFile。
2.1:path (在 include 标签里是 file):指定要加载的文件或文件夹位置
2.2:relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。
<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="20220523-01" author="izy">
<sqlFile path="classpath:liquibase/sql/default.sql"/>
changeSet>
<changeSet id="20220523-02" author="izy">
<sqlFile path="classpath:liquibase/sql/table_2022052301.sql"/>
changeSet>
databaseChangeLog>
如果数据库结构发生了变化,再添加一个,指定对应的sql文件
-- test.test definition
CREATE TABLE `test2` (
`test_id` bigint(20) NOT NULL AUTO_INCREMENT,
`code` varchar(20) DEFAULT '0',
`name` varchar(255) DEFAULT '',
`createDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`test_id`),
KEY `codeandname` (`code`,`name`,`createDate`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
table_2022052301.sql
-- test.test3 definition
CREATE TABLE `test3` (
`test_id` bigint(20) NOT NULL AUTO_INCREMENT,
`code` varchar(20) DEFAULT '0',
`name` varchar(255) DEFAULT '',
`createDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`test_id`),
KEY `codeandname` (`code`,`name`,`createDate`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
init_data.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="20220523-01" author="izy">
<sqlFile path="classpath:liquibase/data/init_data.sql"/>
changeSet>
databaseChangeLog>
-- test.test2 definition
INSERT INTO test.test2 (test_id, code, name, createDate) VALUES(24, '24', '24', NULL);
# 应用服务 WEB 访问端口
server:
port: 8080
# 应用名称
spring:
application:
name: demo-liquibase-base
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username: root
password: root
liquibase:
change-log: classpath:/liquibase/master.xml
# default-schema: st_jtlsp_interlib_sync # pgsql使用
# liquibase-schema: st_jtlsp_interlib_sync # pgsql使用
项目启动前,需要将对应的数据库test创建好
项目在启动的过程中,就会执行未执行过的liquibase脚本,运行结果如下:
DATABASECHANGELOG表、DATABASECHANGELOGLOCK表是liquibase自带的表
表名 | 说明 |
---|---|
DATABASECHANGELOG | 记录的是每一次表修改的记录,里面会详细记录操作的类型和操作。 |
DATABASECHANGELOGLOCK | 用于确保两台计算机不会同时尝试修改数据库,锁库。 |
master.xml可以和change_log中的文件进行合并,只要yml中的配置正确
spring:
liquibase:
change-log: classpath:/liquibase/master.xml
changeLog除了指定sql脚本,还可以通过标签的方式,具体可参考官网文档,示例:
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.9.xsd">
<property name="clob.type" value="clob" dbms="oracle,postgresql"/>
<property name="clob.type" value="longtext" dbms="mysql"/>
<property name="table.name" value="tableA"/>
<changeSet id="1" author="joe">
<createTable tableName="${table.name}">
<column name="id" type="int"/>
<column name="${column1.name}" type="${clob.type}"/>
<column name="${column2.name}" type="int"/>
createTable>
changeSet>
databaseChangeLog>
暂时不会