环境: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 启动应用服务
控制台输出
图片
通过控制台输出,得到下面两个重要信息:
- 创建表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 '';
启动服务,控制台输出:
图片
升级记录表中新增了一条记录
图片
到此一个简单的Flyway应用就完成了,接下来我们继续Flyway在SpringBoot中更多用法。
3. Flyway其它用法
3.1 指定数据库类型
我们可以通过如下配置来设置具体数据库类型的脚本路径
spring:
flyway:
locations:
- classpath:db/migration/{vendor}
通过{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 ;
}
通过使用@FlywayDataSource注解。
- 定义flyway数据源信息
spring:
flyway:
user: root
password: xxxooo
url: jdbc:mysql://localhost:3306/msg?serverTimeznotallow=GMT%2B8&nullCatalogMeansCurrent=true&useSSL=false
通过spring.flyway.*指定flyway自己的数据源。