liqiubase
是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或者回滚到一致的状态.它的目标是提供一种数据库类型无关的解决方案,然后通过执行schema类型的文件来达到迁移.其主要的特点如下:
liquibase 官方文档地址:http://www.liquibase.org/documentation/index.html
2.1 引入 liquibase
核心依赖
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency> 复制代码
2.2 添加配置类(也可以在 application.yml
中配置)
LiquibaseConfig
类,用于 liquibase
的基本配置 import javax.sql.DataSource; import liquibase.integration.spring.SpringLiquibase; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @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; } } 复制代码
application.yml
中进行基本配置 # liquibase配置 liquibase: enabled: true # 开启liquibase 对数据库的管理功能 change-log: "classpath:/db/changelog/db.changelog-master.yaml" #主配置文件的路径 contexts: dev # 引用立秋脚本的上下文,如果存在多个开发环境的话[生产/开发/测试/] check-change-log-location: true # 检查changlog的文件夹是否存在 rollback-file: classPath:/data/backup.sql # 执行更新的时候写入回滚的SQL文件 复制代码
2.3 添加 liquibase
核心文件
文件结构如下
master.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"> <!--includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。 includeAll 标签里有两个属性:path 和 relativeToChangelogFile。 <includeAll path="liquibase/changelogs/" relativeToChangelogFile="false"/> --> <include file="liquibase/changelogs/jdbc.sql" relativeToChangelogFile="false"/> <include file="liquibase/changelogs/changelog-1.0.xml" relativeToChangelogFile="false"/> </databaseChangeLog> 复制代码
changelog
文件
<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="20200508001" author="xc"> <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="项目名字"> <!-- 是否可以为空 --> <constraints nullable="false"/> </column> <column name="project_difficulty" type="float" encoding="utf8" remarks="项目难度"/> <column name="category_id" type="varchar(64)" encoding="utf8" remarks="项目类型类目编号"/> <column name="project_status" type="int(11)" encoding="utf8" remarks="项目状态, 0招募中,1 进行中,2已完成,3失败,4延期,5删除"/> <column name="project_desc" type="varchar(512)" encoding="utf8" remarks="项目简介"/> <column name="project_creater_id" type="varchar(64)" encoding="utf8" remarks="项目创建者id"/> <column name="team_id" type="varchar(64)" encoding="utf8" remarks="项目所属团队id"/> <column name="create_time" type="bigint(64)" encoding="utf8" remarks="创建时间"/> <column name="update_time" type="bigint(64)" encoding="utf8" remarks="更新时间"/> </createTable> </changeSet> <!-- 添加字段 --> <changeSet id="20200508002" author="xc"> <addColumn tableName="project_info"> <column name="phonenumber" type="varchar(255)" encoding="utf-8" remarks="项目负责人联系电话"/> </addColumn> </changeSet> <!-- 删除字段 --> <changeSet id="20200508003" anthor="xc"> <dropColumn tableName="project_info" columnName="phonenumber"/> </changeSet> <!-- 操作数据 --> <changeSet id="3" author="xc"> <code type="section" width="100%"> <insert tableName="project_info"> <column name="id" valueNumeric="3"/> <column name="project_name" value="Manassas Beer Company"/> </insert> <insert tableName="project_info"> <column name="id" valueNumeric="4"/> <column name="project_name" value="Harrisonburg Beer Distributors"/> </insert> </changeSet> <!-- 引入sql脚本文件 --> <changeSet id="6" author="xc"> <sqlFile path="insert-distributor-data.sql"/> </changeSet> <changeSet id="000000000000044" author="hc"> <sqlFile dbms="mysql" endDelimiter=";;" encoding="UTF-8" path="config/liquibase/changelog/functions.sql"/> </changeSet> <changeSet> <!-- 外键、索引的创建语句会影响到本语句的执行,所以将其都放到另外的changeSet中单独去执行 --> <modifySql dbms="mysql"> <append value="ENGINE=INNODB CHARSET=UTF8 COLLATE utf8_unicode_ci"/> </modifySql> </changeSet> </databaseChangeLog> 复制代码