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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: flyway为数据库控制插件,使所有的数据库脚本都在ide(idea,eclipse等)中控制,这样能做到版本有迹可循。


image.png

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。

image.png

3.脚本结构

image.png

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

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

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

image.png

 

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中的脚本)

根据上文,在初始化时会产生以下记录。

image.png

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

三.整合quartz

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

1.注释掉@PostConstruct中内容

image.png

2.添加配置

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

@Component
public 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);
            }
        });
    }
}


相关文章
|
5月前
|
存储 监控 安全
360 企业安全浏览器基于阿里云数据库 SelectDB 版内核 Apache Doris 的数据架构升级实践
为了提供更好的日志数据服务,360 企业安全浏览器设计了统一运维管理平台,并引入 Apache Doris 替代了 Elasticsearch,实现日志检索与报表分析架构的统一,同时依赖 Doris 优异性能,聚合分析效率呈数量级提升、存储成本下降 60%....为日志数据的可视化和价值发挥提供了坚实的基础。
360 企业安全浏览器基于阿里云数据库 SelectDB 版内核 Apache Doris 的数据架构升级实践
|
5月前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
124 0
|
3月前
|
SQL Java 数据库
使用Spring Boot和Flyway进行数据库迁移
使用Spring Boot和Flyway进行数据库迁移
|
4月前
|
缓存 负载均衡 监控
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
探秘数据库中间件:ProxySQL与MaxScale的优势与劣势
93 2
|
1月前
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
61 1
|
2月前
|
运维 安全 Cloud Native
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
|
5月前
|
关系型数据库 Go 数据库
【Go语言专栏】Go语言中的数据库迁移与版本控制
【4月更文挑战第30天】本文介绍了Go语言中的数据库迁移和版本控制。针对数据库迁移,文章提到了使用Flyway和Liquibase两个工具。通过示例展示了如何在Go中集成这两个工具进行数据库结构的修改,以适应业务变化。而对于版本控制,文章以Git为例,说明了如何利用Git进行源代码和配置文件的管理,确保代码一致性与可追溯性。
163 0
|
3月前
|
存储 运维 NoSQL
现代化企业管理中的数据库选择与优化策略
在当今信息化时代,企业管理越来越依赖于高效的数据库系统来支撑业务运作。本文探讨了在选择和优化数据库时需要考虑的关键因素,包括数据类型、访问模式以及性能需求。通过分析不同数据库系统的特性和优劣势,帮助企业在面对日益复杂的业务需求时,选择合适的数据库解决方案,提升管理效率和业务运行质量。
|
4月前
|
缓存 NoSQL 中间件
应对数据库不断膨胀的数据:缓存和队列中间件
【6月更文挑战第5天】该文探讨了优化数据库使用以提升应用系统性能的策略。文中建议利用Redis缓存和MQ消息队列作为辅助工具,以进一步优化性能和减少资源消耗。
86 2
应对数据库不断膨胀的数据:缓存和队列中间件
|
3月前
|
中间件 Java 测试技术
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决
单元测试问题之编写单元测试时运行环境、数据库、中间件问题如何解决
下一篇
无影云桌面