简介
在我们开发的过程中,数据库的部署和管理如果只用sql文件导入的方式来处理会有一个问题,就是每次版本更新的时候,你都需要清空数据库,再导入sql文件,当然你也可以在每次更新版本的时候把数据库的修改写成脚本,liquibase就是来做这件事的,他的功能更丰富,支持正向迁移、回滚,数据填充,本文只介绍如何实现正向迁移和数据填充。
特点
- 目前支持包括Oracle/SqlServer/DB2/MySql/Sybase/PostgreSQL/Cache 等12种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。
- 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(changset),支持数据库变化的合并,因此支持多开发人员同时合作。
- 在数据库中保存数据库修改历史,在数据库升级时自动跳过以应用的变化(ChangSet)。
- 提供变化应用的回滚功能,可按时间,数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
开始
-
导入依赖
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
当然这个功能是依赖数据库的,所以前提是保证数据连接正常,我用的是mysql5.7数据库
-
设置配置文件
spring: liquibase: enabled: true change-log: classpath:/db/changelog/master.xml
这个是设置主配置文件,在项目启动时,springboot会自动加载这个配置并根据配置去执行你写的所有数据库相关的配置(表结构创建和数据填充)。
如果不设置,默认会去加载 classpath:/db/changelog/db.changelog-master.xml
设置完成后去/db/changelog/目录下创建master.xml文件,看一下主配置文件的内容。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- includeAll可以把db/changelog/migrate/内所有的文件全部引用并执行 --> <includeAll path="db/changelog/migrate/" relativeToChangelogFile="false" /> </databaseChangeLog>
这里建议使用xml格式,当然你也可以只用yml和json
-
创建表结构,修改表结构等操作
接下来我们需要在db/changelog/migrate/文件内创建你需要创建的表结构,或者修改表结构的配置,看一个例子:
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="1" author="sheng"> <createTable tableName="users" remarks="用户表"> <column name="id" type="int" remarks="用户ID,主键" autoIncrement="true"> <constraints nullable="false" primaryKey="true" primaryKeyName="id"/> </column> <column name="name" type="varchar(40)" remarks="用户名"> <constraints nullable="false"/> </column> <column name="password" type="varchar(40)" remarks="密码"> <constraints nullable="false"/> </column> <column name="token" type="varchar(40)" remarks="token" defaultValue=""/> <column name="created_at" type="datetime" remarks="创建时间"/> <column name="sort" type="int" defaultValue="1" remarks="排序"/> <column name="last_login_time" type="datetime" remarks="最后一次登录时间"/> <column name="head_pic" type="text" remarks="头像"> <constraints nullable="false"/> </column> </createTable> </changeSet> </databaseChangeLog>
这是创建一个用户表。
目录结构是这样的
这里有一个文件名的问题,个人习惯是用当天的时间+操作类型+表名来定义的,你也可以有自己的规划,只需要在includeAll修改path就可以了,注意,主配置文件的位置,可能会有循环调用的问题。
现在就可以启动项目,看一下数据库已经创建好了users表了,同时还创建了两个表(databasechangelog,databasechangeloglock),用来实现你每次 迁移、回滚等操作。
-
数据填充
数据填充功能还是很有用的,使用起来也很简单,只需要在主配置文件内加入loadData标签,我们来看一下。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- includeAll可以把db/changelog/migrate/内所有的文件全部引用并执行 --> <includeAll path="db/changelog/migrate/" relativeToChangelogFile="false" /> <changeSet id="6" author="sheng"> <!-- loadData 这里主要的字段是file,标识了你csv文件的位置 --> <loadData encoding="UTF-8" tableName="users" file="db/changelog/seed/users.csv" separator=","> <column name="id" type="NUMERIC"/> <column name="name" type="STRING"/> <column name="password" type="STRING"/> <column name="token" type="STRING"/> <column name="created_at" type="timestamp"/> <column name="sort" type="NUMERIC"/> <column name="last_login_time" type="timestamp"/> <column name="head_pic" type="STRING"/> </loadData> </changeSet> </databaseChangeLog>
数据填充一般是我们项目初始化的一些数据,比如超级管理员。这里file字段表示的是需要导入数据的CSV文件的位置;看一个CSV文件的例子:
"id","name","password","token","created_at","sort","last_login_time","head_pic" "1","admin","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "2","admin1","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "3","admin2","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "4","admin3","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "5","admin4","123456","","","1","","/img/head_pic/2019040917510740548.jpg"
字段名要在第一行。
这里有一个问题,因为连接数据库的操作是先执行的,所以需要先创建数据库才能使用此功能。
最后,文件目录大致是这样的:
注意事项
- ChangeSet必须填写author。
- Liquibase禁止对业务数据进行sql操作。
- 所有表,列要加remarks进行注释。
- 已经执行过的ChangeSet严禁修改。
- 不要随便升级项目liquibase版本,特别是大版本升级。不同版本ChangeSet MD5SUM的算法不一样。
最后,如果想看更详细的相关操作可以去看一下这篇文章:
[https://blog.csdn.net/u012934325/article/details/100652805]: