祝大家新年快乐,有任何问题可与我联系:
Java(SpringBoot)数据库版本管理工具目前主流的就是flyway和liquibase,在确认选型之前看了很多对比的文章,大多观点是支持flyway的,主要因为其配置灵活。因此我也准备在我们组内使用flyway,结果在配置弄到一半的时候发现最新版本的flyway不支持我们当前的Oracle版本(支持需要付费),也不知道以后会不会往收费方向发展,于是无奈只能尝试liquibase了。
使用之后发现其实liquibase也没有网上说的那么不好用,最新版本的liquibase已经能够满足我们的要求了,非常好用,可能是网上的文章比较老旧。
在使用时我们必须要考虑到团队或项目以后的发展,如果项目越做越大成员越来越多,项目的维护成本就会越高,以后项目也有可能会拆分出N个子项目,所以我们现在就要考虑以后业务模块会怎么拆分,并建立对应的子目录。怎么分子项目这里不多说,说说我们现在的项目情况:
rd-common:公共模块,对所有子项目提供jar包
rd-pay:支付模块,对所有子项目提供支付接口
rd-busi:业务模块,各种业务都在这个子项目里面,各个子业务都是分了目录的,当业务需要独立时可以快速的拆分成子项目
在没有使用数据库版本管理工具之前主要有以下几个问题:
rd-common变更导致各个子项目数据库更新不及时或对数据库重复更新
提交测试的版本经常遗漏了脚本导致测试不通过
各个不同地区上线的项目在升级时经常出现数据库不一致
升级脚本时的人为问题
下面开始具体的配置:
一、首先在src/main/resources建立liquibase目录,所有的升级脚本都放这:
rd-common:
src/main/resources
/db/liquibase/common/master.xml
rd-pay:
src/main/resources
/db/liquibase/pay/master.xml
rd-busi:
src/main/resources
/db/liquibase/busi1/master.xml
/db/liquibase/busi2/master.xml
common目录的建立是为了保证各个子项目使用最新的jar包时能自动升级公共模块的数据库。
busi目录建立busi1和busi2是为了保证busi1和bsui2可以独立维护和拆分。
二、其次就是配置类了,需要为每个master.xml写一个liquibase的配置类,否则liquibase不会生效。
rd-common:
@Configuration
public class CommonLiquibaseConfig {
@Bean
public SpringLiquibase commonLiquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:db/liquibase/common/master.xml");
liquibase.setShouldRun(true);
liquibase.setDatabaseChangeLogTable("RP_LIQUIBASE_COMMON");
liquibase.setDatabaseChangeLogLockTable("RP_LIQUIBASE_LOCK_COMMON");
return liquibase;
}
}
rd-pay:
@Configuration
public class PayLiquibaseConfig {
@Bean
public SpringLiquibase payLiquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
liquibase.setChangeLog("classpath:db/liquibase/pay/master.xml");
liquibase.setShouldRun(true);
liquibase.setDatabaseChangeLogTable("RP_LIQUIBASE_PAY");
liquibase.setDatabaseChangeLogLockTable("RP_LIQUIBASE_LOCK_PAY");
return liquibase;
}
}
三、最后就是脚本升级了,放在与master.xml同级目录
master.xml
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"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
v20190516.sql
--liquibase formatted sql
--changeset liuyang:v20190516-1
--comment 任务表添加字段:任务标题
alter table sys_job add job_title VARCHAR2(50);
comment on column sys_job.job_title is '任务标题';
--rollback alter table sys_job drop column job_title;
--changeset liuyang:v20190516-2
--comment 参数表添加字段:状态
alter table sys_config add status char(1) default '0';
comment on column sys_config.status is '状态(0启用 、1禁用)';
--rollback alter table sys_config drop column status;
~谢谢打赏~手机请长按图片~
赞 赏