每次服务的代码更新部署,难免会存在数据库结构的变更以及字典数据的添加,手动执行更新脚本是一个耗时耗力的工作,而且还会出现遗漏或者其他状况,SpringBoot内部集成了一个自动执行数据库脚本的第三方依赖Flyway来解决这个繁琐的问题。
免费教程专题
恒宇少年在博客整理三套免费学习教程专题,由于文章偏多特意添加了阅读指南,新文章以及之前的文章都会在专题内陆续填充,希望可以帮助大家解惑更多知识点。
什么是Flyway
官网给出的定义是Version control for your database. Robust schema evolution across all your environments. With ease, pleasure and plain SQL.(数据库的版本控制,在所有环境中进行稳健的架构演变,轻松,愉快和简单的SQL。)
Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。
Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
Flyway运行原理
当我们运行配置使用Flyway的应用程序时,会自动在配置数据源的数据库内创建一个名为
flyway_schema_history的表,该表内存放了数据库的历史记录信息。
然后通过扫码应用程序的/reosurces/db/migration目录下的历史版本脚本SQL文件,文件格式为:V?__desc.sql,如:V1__init-db.sql,根据版本号进行排序后,获取最大的版本号与flyway_schema_history表内执行成功的最大版本号进行比对,如果项目内版本较高,则自动执行脚本文件。
创建项目
通过idea工具创建SpringBoot项目,在pom.xml添加相关依赖如下所示:
org.springframework.boot
spring-boot-starter
org.flywaydb
flyway-core
org.springframework.boot
spring-boot-starter-jdbc
com.zaxxer
HikariCP
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
添加数据库配置
在application.yml配置文件内添加数据源信息,如下所示:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flyway
username: root
password: 123456
type: com.zaxxer.hikari.HikariDataSource
添加Flyway版本脚本
脚本比较简单,大家可以任意添加一些SQL来查看结构或者数据变动。
db.migration目录是SpringBoot在整合Flyway时默认读取版本脚本的目录,我们可以在application.yml配置spring.flyway.locations参数进行修改。
测试
当我们启动项目时,会自动比对脚本的版本,在db.migration目录内找到V1.1__add_logging.sql为最高版本,拿着1.1再去flyway_schema_history表内执行成功最大的版本比对,如果低于1.1则自动执行V1.1_add_logging.sql脚本内容,否则跳过。
flyway_schema_history表
每次启动项目如果存在可更新的脚本信息,执行完成后会自动在flyway_schema_history表内添加一条记录。
installed_rank
version
description
type
script
checksum
installed_by
installed_on
execute_time
success
1
1
init
SQL
V1__init.sql
2034194600
root
2019-10-23 21:44:36
17
1
2
1.1
add logging
SQL
V1.1_add_logging.sql
1859098444
root
2019-10-23 21:46:50
54
1
敲黑板,划重点
本章简单的介绍了Flyway的基本使用方法,它很强大,功能远远不止于此,使用脚本统一自动执行可大大减少手动执行出现的遗漏、错误等。
存在既有道理,为什么不尝试使用呢?
作者个人 博客
使用开源框架 ApiBoot 助你成为Api接口服务架构师