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

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

环境: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
@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自己的数据源。

责任编辑:武晓燕 来源: Spring全家桶实战案例源码
相关推荐

2017-12-27 15:16:35

Spring BootFlyway数据库

2020-08-13 07:42:15

数据库Flyway代码

2019-10-30 11:28:56

Javaflyway数据库

2021-03-09 17:11:09

数据库脚手架开发

2021-06-29 17:19:44

Spring Boot集成Flyway

2022-04-08 11:25:58

数据库操作AbilityData

2021-12-27 09:50:03

JavaScript开发数据分组

2021-05-17 08:00:00

数据库工具Flyway

2011-03-17 13:23:08

数据导入导出

2022-06-02 13:59:57

数据迁移数据

2011-05-25 00:00:00

数据库设计

2009-07-01 10:46:57

JSP程序JSP代码

2024-04-03 10:05:02

2009-08-25 16:36:16

C#进行数据库编程

2024-12-06 09:27:28

2009-03-16 13:30:55

脚本数据字典Oracle

2010-03-30 18:48:24

Oracle 学习

2011-12-30 09:03:59

MySQL数据库

2011-03-01 16:30:55

Oracle

2017-10-31 11:55:46

sklearn数据挖掘自动化
点赞
收藏

51CTO技术栈公众号