写点什么

数据库版本控制中间件 flyway 企业落地

作者:小黄鸡1992
  • 2021 年 11 月 20 日
  • 本文字数:1486 字

    阅读完需:约 5 分钟

数据库版本控制中间件flyway企业落地

flyway 为数据库控制插件,使所有的数据库脚本都在 ide(idea,eclipse 等)中控制,这样能做到版本有迹可循。


这里需要注意如果使用 flyway 就要禁止在数据库管理软件中更改数据库表结构

一.springboot 整合 flyway

1.pom.xml

        <dependency>            <groupId>org.flywaydb</groupId>            <artifactId>flyway-core</artifactId>            <version>6.4.4</version>        </dependency>
复制代码

2.application.yml

spring: flyway: # flyway 数据库 DDL 版本控制    enabled: true # 正式环境才开启    clean-disabled: true # 禁用数据库清理    encoding: UTF-8    locations: classpath:/db #脚本存放地址    table: flyway_schema_history_systemportal #flyway记录表,记录了当前执行到了那个脚本    baseline-version: 1 # 基线版本默认开始序号 默认为 1    baseline-on-migrate: true #  针对非空数据库是否默认调用基线版本,为空的话默认会调用基线版本    placeholder-replacement: false    placeholders: # 定义 afterMigrateError.sql 要清理的元数据表表名      flyway-table: ${spring.flyway.table}
复制代码


在第一次初始化时有可能出现以下错误,需要加上 placeholder-replacement: false。


3.脚本结构

在定义初始化脚本时,版本号建议为 V+(编号)+__(为双下划线)+业务名称+init,例如楼主的 V1__systemportal_init.sql。


在定义变更版本时,版本号为 V+(编号)+__(为双下划线)+操作+表名称,例如楼主的为 V2__update_table.sql。


其中 V1__systemportal_init.sql(初始化脚本)为项目所有的表结构与数据 以下方式导出。



V2__update_table.sql 为变更版本(表结构变化的脚本,如果没有变更,只存在 init 脚本即可)其中内容如下 。


  ALTER TABLE "systemportal"."task_plan"  ALTER COLUMN "update_user" TYPE varchar(255) USING "update_user"::varchar(255);
复制代码


执行以上操作后,将原数据库表数据全部删除(记得做好备份) 然后启动项目,即可在数据库中生成表,说白了,就是按照 db 中的脚本依次执行一遍。

二.原理

当使用 flyway 时,会生成一个记录表,记录当前已经执行的脚本名称。(script 字段就是已经执行了的 db 中的脚本)根据上文,在初始化时会产生以下记录。



如果再次启动时,会查询该表是否有大于 V2 版本的脚本,如果有执行这些脚本 如果没有什么也不执行。

三.整合 quartz

当整合 quartz 时,需要查询表,但是因为使用了 flyway 此时并没有表结构,所以需要处理。

1.注释掉 @PostConstruct 中内容

2.添加配置

添加以下配置(在启动后执行)


@Componentpublic class RuntimeConfig implements ApplicationListener<ContextRefreshedEvent> {
@Autowired private Scheduler scheduler;
@Autowired private QrtzJobDao qrtzJobDao;
@Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { this.initJob(); }
public void initJob() { QrtzJobVO qrtzJobVO = new QrtzJobVO(); List<QrtzJobVO> scheduleJobList = qrtzJobDao.queryQrtzJobAll(qrtzJobVO); scheduleJobList.forEach(scheduleJob -> { CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(this.scheduler, scheduleJob.getJobId()); if (cronTrigger == null) { ScheduleUtils.createScheduleJob(this.scheduler, scheduleJob); } else { ScheduleUtils.updateScheduleJob(this.scheduler, scheduleJob); } }); }}
复制代码


用户头像

小黄鸡1992

关注

小黄鸡加油 2021.07.13 加入

一位技术落地与应用的博主,带你从入门,了解和使用各项顶流开源项目。

评论

发布
暂无评论
数据库版本控制中间件flyway企业落地