优雅!Spring Boot使用Flyway进行数据库脚本迁移管理

文摘   科技   2025-01-25 10:00   新疆  

Spring Boot 3实战案例合集》现已囊括超过80篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

【重磅发布】《Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有80个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。这意味着,随着技术的不断发展和Spring Boot 3的深入应用,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
请立即订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集


环境:SpringBoot2.7.18 + Flyway8.5.13



1. 简介

Flyway是一个开源的数据库迁移工具,它通过定义一系列有序的SQL脚本(称为迁移),帮助你管理数据库的结构变更。这些迁移脚本可以用于创建表、修改列、添加索引等任何数据库更改操作。Flyway的主要特性和优势包括:

  • 版本控制:Flyway为数据库的每个变更分配一个版本号,只有新的变更才会被应用,已经应用过的变更不会重复执行。这使得数据库变更更加可控和可追踪。

  • 跨平台:Flyway支持主流的关系型数据库,包括MySQL、PostgreSQL、Oracle、SQL Server等。

  • 易用性:Flyway提供了简单的命令行界面和API,使得开发人员可以轻松地集成到他们的项目中。同时,它还支持与Spring Boot等主流开发框架进行集成。

  • 自动化:Flyway可以自动化执行数据库迁移,这使得敏捷开发团队可以更快地开发新功能,同时也可以更容易地进行测试和部署。

在实际项目开发中通过Flyway可以确保每个数据库变更都有一个唯一的版本号,并按照版本号顺序执行,从而避免了重复或错乱的变更。这使得开发人员能够清晰地跟踪和管理数据库的历史变更,并确保不同环境(如开发、测试和生产)之间的数据库结构一致性。

2. 实战案例

注意:我当前使用的版本Flyway对应的数据库mysql版本必须是8。

2.1 引入依赖

<dependency>  <groupId>org.flywaydb</groupId>  <artifactId>flyway-core</artifactId></dependency><dependency>  <groupId>org.flywaydb</groupId>  <artifactId>flyway-mysql</artifactId></dependency>

2.2 配置数据库

spring:  datasource:    driverClassName: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/pack?serverTimezone=GMT%2B8&useSSL=false&characterEncoding=UTF-8    username: root    password: xxxooo    type: com.zaxxer.hikari.HikariDataSource

2.3 Flyway配置

spring:  flyway:    enabled: true    # 用于存储迁移历史记录的表名, 默认: flyway_schema_history    table: flyway_schema_history    # 迁移脚本编码, 默认: UTF-8    encoding: UTF-8    # 当迁移数据库存在但没有元数据的表时,自动执行基准迁移,新建flyway_schema_history表    baseline-on-migrate: true    # 数据库迁移脚本的位置, 默认: classpath:db/migration    # 这里也支持文件系统路径,前缀:filesystem:    locations:    - classpath:db/migration

上面的配置都使用的默认值,如果你没有自定义需求,你完全可以不进行配置。

最终项目目录结构如下:

初始数据库中有如下表:

2.4 准备数据库升级脚本

接下来在db/migration下新建一个迁移脚本(升级),文件名:V1.0_001__create_table.sql

create table t_person (  id int auto_increment primary key,  name varchar(32) not null,  sex varchar(2) not null,  age int default 0);

创建表t_person。

特别说明:通常情况下,迁移脚本的格式为 V<VERSION>__<NAME>.sql(其中 <VERSION> 为下划线分隔的版本,如 "1 "或 "2_1";<NAME>一般你可以写上该脚本的描述信息)。还有一点要注意:<VERSION>与<NAME>中间是两个下划线:'__',最终目录如下:

到此所有的配置都完成,接下来只需要启动服务即可。

2.5 启动应用服务

控制台输出

通过控制台输出,得到下面两个重要信息:

  1. 创建表flyway_schema_history

  2. 成功升级一个脚本版本是v1.0.001

查看数据库情况

执行了升级脚本,创建了数据库。查看flyway_schema_history表数据:

记录了升级脚本文件及版本信息。当多次启动服务并不会重复的执行。如果你将这里的记录删除再吧t_person表删除,那么下次重启服务还会执行升级脚本。

经过xxx时间后系统升级数据库脚本也升级了,我们可以继续添加升级脚本文件,如下:

新增了一个脚本文件V1.1_001__update-t_person.sql,文件内容:

alter table t_person add column email varchar(32) default '';

启动服务,控制台输出:

升级记录表中新增了一条记录

到此一个简单的Flyway应用就完成了,接下来我们继续Flyway在SpringBoot中更多用法。

3. Flyway其它用法

3.1 指定数据库类型

我们可以通过如下配置来设置具体数据库类型的脚本路径

spring:  flyway:    locations:    - classpath:db/migration/{vendor}

通过{vendor}占位符,该占位符会更加你当前环境的数据库类型自动替换,我们只需要在对应的路径下建立文件夹及升级文件即可,如下:

3.2 使用其它数据库

在默认情况下,Flyway使用的是你当前环境中主数据源(存在多个的时候,应用@Primary标记的数据源),我们可以通过如下两种方式使用其它数据源(多数据源情况下):

  • 自定义FlywayDataSource

@Bean@FlywayDataSourceDataSource flywayDataSource() {  HikariDataSource dataSource = new HikariDataSource();  dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/msg?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false&characterEncoding=UTF-8");  dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");  dataSource.setUsername("root");  dataSource.setPoolName("flyway") ;  dataSource.setPassword("xxxooo");  return dataSource ;}

通过使用@FlywayDataSource注解。

  • 定义flyway数据源信息

spring:  flyway:    user: root    password: xxxooo    url: jdbc:mysql://localhost:3306/msg?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false

通过spring.flyway.*指定flyway自己的数据源。

以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

不知道这些不要说玩转了Controller接口

实战案例SpringBoot整合Seata AT模式实现分布式事务【超详细】

SpringBoot优雅地定制JSON响应数据

高级开发!性能优化,Spring Boot 不使用AOP也能优雅的记录日志

技术专家!Spring Boot 增强版 @RequestMapping 添加限流功能

【专家级】Spring事件机制,深入剖析,提升你的技术水平!

OpenFeign高级用法:这些强大的功能你用过吗?

请一定牢记SpringBoot项目开发中的8个扩展接口

Spring6.x这5个新功能还是非常不错的

【Spring/Boot/Cloud】这些扩展点一定要知道,从应用到原理详解

详解Spring Cloud Task短期运行的微服务框架

解锁Spring隐藏工具类:让你的开发效率飞升

【必读】@Configuration注解天天用,你真的了解它吗?

注解+Caffeine:高性能接口限流的双刃剑

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章