这么做的初衷是不想让团队成员在表结构的更改,seed 数据和 demo 数据的配置这块浪费时间,考虑到以前 OFBiz 的 entity engine 的功能,可以自定义字段,在启动时检查并更新数据库,于是就在朋友推荐下,找到了这个开源软件 liquibase,下面记录下使用过程。
liquibase 是什么,之类就不过多讲了,大家可以 Google 一下,很多,我用的是若依4.x 的开发脚手架,基于 springboot 2.x 的
-
添加依赖,我把它放在了 ruoyi-common 这个模块下,在模块的 pom.xml 中增加一个依赖
<!-- 数据库版本管理工具 --> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
-
编写配置类
package com.ruoyi.common.config;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class LiquibaseConfig {
@Bean
public SpringLiquibase liquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
//指定changelog的位置,这里使用的一个master文件引用其他文件的方式
liquibase.setChangeLog("classpath:/db/liquibase/changelog-master.xml");
liquibase.setDropFirst(false);
//liquibase.setContexts("development,test,production");
liquibase.setShouldRun(true);
return liquibase;
}
}
3.按照配置类中的changelog 地址,编写 changelog 主文件(这里采用 include 的方式)
在 resources 目录下新建 db/liquibase/changelog/changelog-master.xml 这个文件作为主文件,内容是包含了 x 目录下所有的 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">
<includeAll path="db/liquibase/changelog/" relativeToChangelogFile="false"/>
</databaseChangeLog>
4.在 resources 目录里 db/liquibase/changelog/ 中,写接下来的所有的 changelog,例如我这里写了一个 init.xml 用于 ruoyi 初始化的数据库,sqlFile 即表示直接执行 sql,其他的语法请参阅文档。
<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="init-202010151055" author="wangyuliang">
<sqlFile path="classpath:/db/sql/adfontes-fries.sql" encoding="UTF-8" />
</changeSet>
</databaseChangeLog>
5.至此的话,liquibase 的配置在 springboot 中基本结束,但是在ruoyi 项目中,会有一些启动即开始加载的程序,比如一些系统参数 sysconfig 之类的,这样就会导致如果是第一次部署的话,则会先执行 sysconfig,再执行 liquibase,这样的话,是找不到数据库的。那么在查阅相关代码后,发现 ruoyi 中这些程序是加了 @PostConstruct 注解,这个注解是在bean 的构造函数之后,init 之前执行,在 ruoyi 中作为启动加载。
我这块的解决办法是,在这些需要启动加载的 class 上增加 @DependsOn("liquibase") 注解,这个表示当前 bean 的实例化是需要依赖 liquibase 的 bean,所以 liquibase 会优先启动,在第一次启动这个项目的时候,就会先执行 liquibase,后加载 sysconfig 数据
不确定我这种做法在后期会不会有坑,如果知道的朋友能指出错误,谢谢