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

环境: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>1.2.3.4.5.6.7.8.
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.HikariDataSource1.2.3.4.5.6.7.
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/migration1.2.3.4.5.6.7.8.9.10.11.12.13.

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

最终项目目录结构如下:

图片

初始数据库中有如下表:

图片

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 );1.2.3.4.5.6.

创建表t_person。

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

图片

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

2.5 启动应用服务

控制台输出

图片

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

创建表flyway_schema_history成功升级一个脚本版本是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 ;1.

启动服务,控制台输出:

图片

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

图片

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

3. Flyway其它用法

3.1 指定数据库类型

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

复制
spring: flyway: locations: - classpath:db/migration/{vendor}1.2.3.4.

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

图片

3.2 使用其它数据库

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

自定义FlywayDataSource
复制
@Bean @FlywayDataSource DataSource flywayDataSource() { HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/msg?serverTimeznotallow=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 ; }1.2.3.4.5.6.7.8.9.10.11.

通过使用@FlywayDataSource注解。

定义flyway数据源信息
复制
spring: flyway: user: root password: xxxooo url: jdbc:mysql://localhost:3306/msg?serverTimeznotallow=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false1.2.3.4.5.

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

阅读剩余
THE END