SpringBoot实战电商项目mall(40k+star)地址:github.com/macrozheng/…
摘要
当我们的应用升级时往往会伴随着数据库表结构的升级,此时就需要迁移数据库的表结构。一般我们会使用工具或者脚本来实现,手动操作毕竟有一定风险,要是能在应用启动时自动升级数据库表结构就好了!Flyway正是这么一款工具,通过Flyway和SpringBoot结合使用,在应用启动时就可以自动升级数据库表结构,非常方便,推荐给大家!
Flyway简介
Flyway是一款数据库迁移工具,它让数据库迁移变得更加简单。它能像Git一样对数据库进行版本控制,支持命令行工具、Maven插件、第三方工具(比如SpringBoot)等多种使用方式。
Flyway具有如下特点:
- 简单:使用和学习简单,通过不同版本的SQL脚本实现数据库迁移。
- 专业:专注于数据库迁移功能,你无需担心有任何问题。
- 功能强大:支持多种数据库,拥有大量的第三方工具,支持CI/DI。
相关概念
工作原理
使用Flyway时我们需要编写好数据库迁移的SQL脚本,比如 V1__Initial_Setup.sql
中初始化了三种表,V2__First_Changes.sql
中又新增了两种表。Flyway会创建flyway_schema_history
表,用于存储这些SQL脚本的执行情况,从而对数据库进行版本控制。当我们使用Flyway进行数据库迁移时,Flyway会根据flyway_schema_history
表中的记录,自行决定需要执行哪些SQL脚本,从而实现数据库迁移。
脚本命名规范
在创建Flyway的SQL脚本时,有些命名规范需要遵守,这些命名规范决定了Flyway执行脚本的顺序和方式,可以先参考下面的示意图。
为了能被Flyway正确执行,SQL迁移脚本需要遵循如下规范:
- Prefix(前缀):
V
表示有版本号的数据库迁移,U
表示一些数据库版本的回滚,R
表示可重复执行的数据库迁移; - Version(版本号):Flyway会按照版本号的大小顺序来执行数据库迁移脚本;
- Separator(分隔符):命名时使用双下划线分隔符;
- Description(描述):用于描述该迁移脚本的具体操作说明;
- Suffix(后缀):表示
.sql
文件。
相关命令
- migrate:数据库迁移命令,会根据设置好的SQL脚本直接将数据库表升级至最新版本。
- clean:删除数据库中所有的表,千万别在生产环境上使用。
- info:打印所有关于数据库迁移的详细信息和状态信息。
- validate:验证数据库迁移是否可用。
- undo:对数据库迁移进行回滚操作。
- baseline:以现有数据库为基准,创建
flyway_schema_history
表,大于基准版本的数据库迁移才会被应用。 - repair:修复
flyway_schema_history
表。
命令行工具
使用Flyway实现数据迁移有多种方式,我们先通过命令行工具的方法来体验下Flyway的使用。
- 首先需要下载Flyway的命令行工具,下载社区版即可,下载地址:flywaydb.org/download
- 下载完成后进行解压,解压完成后目录结构如下;
- 修改Flyway的配置文件
/conf/flyway.conf
,修改下数据库配置即可;
1 | ini复制代码flyway.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai |
- 在
/sql
目录下添加SQL执行脚本,这里添加创建ums_admin
表的执行脚本V1.0.1__Create_ums_admin_table.sql
;
1 | sql复制代码CREATE TABLE `ums_admin` |
- 使用
flyway migrate
命令进行数据迁移,此时我们会发现需要先使用flyway baseline
命令创建保存迁移记录的表flyway_schema_history
才行;
- 先使用
flyway baseline
命令,再使用flyway migrate
命令,命令行会输出执行成功的信息;
- 在
\sql
目录下添加SQL执行脚本,给ums_admin
表添加一些数据,执行脚本为V1.0.2__Add_ums_admin.sql
;
1 | sql复制代码INSERT INTO ums_admin (username, PASSWORD, email, nick_name, STATUS) |
- 我们可以使用
flyway info
命令查看flyway_schema_history
表中的数据迁移记录,可以发现1.0.2
版本的更新还处于Pending
状态,使用flyway migrate
命令后变为Success
;
- 我们可以创建可重复执行的SQL脚本,通常可以用来创建视图、存储过程、函数等,比如基于
ums_admin
表创建一个视图,执行脚本为R__Ums_admin_view.sql
;
1 | sql复制代码CREATE |
- 使用
flyway migrate
命令可以重复执行(当R开头的脚本有变更时),该脚本会在所有V
开头的脚本执行完成后执行;
- Flyway的回滚机制需要依赖SQL脚本,这里创建
U1.0.1__Create_ums_admin_table.sql
和U1.0.2__Add_ums_admin.sql
两个回滚脚本;
1 | sql复制代码# U1.0.1__Create_ums_admin_table.sql |
1 | sql复制代码# U1.0.2__Add_ums_admin.sql |
- 使用
flyway undo
命令可以执行回滚,很遗憾的是社区版本不支持回滚,看样子数据库升级之前还是得通过工具做好备份才行!
Maven插件
Flyway也提供了Maven插件,插件所支持功能与命令行工具基本一致。
- 想要在Maven项目通过插件使用Flyway,首先需要在pom.xml中添加Flyway的插件并配置好数据库连接信息;
1 | xml复制代码<!--Flyway的Maven插件--> |
- 在resouce目录下创建
db\migration
目录,将数据库升级使用的SQL脚本放入进去;
- Flyway的Maven插件支持如下几种命令;
- 双击
flyway:info
命令使用,输出如下内容,此方式与命令行工具使用基本没啥区别。
1 | csharp复制代码[INFO] --- flyway-maven-plugin:7.3.2:info (default-cli) @ mall-tiny-flyway --- |
结合SpringBoot使用
由于SpringBoot官方已经支持了Flyway,所以Flyway结合SpringBoot使用非常简单!
- 首先在pom.xml中添加Flyway相关依赖,注意无需添加Flyway的版本号:
1 | xml复制代码<!--Flyway相关依赖--> |
- 修改配置文件
application.yml
,对数据源和Flyway进行配置;
1 | yaml复制代码spring: |
- 最后直接运行SpringBoot应用,即可自动创建好对应的数据库,控制台会输出如下信息。
1 | yaml复制代码2020-12-24 14:38:15.659 INFO 10716 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 6.4.1 by Redgate |
总结
对比手动升级数据库表结构,使用Flyway自动升级更有优势。使用Flyway可以在我们升级应用时同时升级数据库,由于社区版本目前不支持数据库回滚,升级前做好备份是很有必要的。
参考资料
官方文档:flywaydb.org/documentati…
项目源码地址
本文 GitHub github.com/macrozheng/… 已经收录,欢迎大家Star!
本文转载自: 掘金