SpringBoot使用Flyway进行数据库管理
# Flyway是什么
Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。
就目前而言,我们部署应用的流程大概是这样的:
- 开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本
- DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级
- 应部署人员拿到应用部署包,备份、替换,以完成应用程序升级
引入Flyway之后的应用部署流程大概是这样的:
- 开发人员将应用程序打包
- 应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)
# SpringBoot如何集成使用
如果创建项目时就选择了 Flyway 依赖,就会有db/migration这个目录。后期集成 Flyway,这个目录就需要我们手动创建了。
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
然后在 resources 目录下,手动创建 db/migration 目录,并在该目录下创建数据库脚本,数据库脚本的命名方式如下:
V<VERSION>__<NAME>.sql
首先是大写字母 V,然后是版本号,要是有小版本可以用下划线隔开,例如 2_1,版本号后面是两个下划线,然后是脚本名称,文件后缀是 .sql。
例如我这里创建我的第一个数据库脚本,取名为 V1.0__initialize.sql 。
项目启动,Flyway 会自动创建一个 flyway_schema_history 表,这个表用来记录数据库的更新历史。
有了这条记录,下次再启动项目,V1.0__initialize.sql 这个脚本文件就不会执行了,因为系统知道这个脚本已经执行过了,如果你还想让 V1__vhr.sql 脚本再执行一遍,需要手动删除 flyway_schema_history 表中的对应记录,那么项目启动时,这个脚本就会被执行了。
# 注意
- 我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本,V 字开头的脚本只会执行一次,而 R 字开头的脚本,只要脚本内容发生了变化,启动时候就会执行。
- 使用了 Flyway 之后,如果再想进行数据库版本升级,就不用该以前的数据库脚本了,直接创建新的数据库脚本,项目在启动时检测了有新的更高版本的脚本,就会自动执行,这样,在和其他同事配合工作时,也会方便很多。因为正常我们都是从 Git 上拉代码下来,不拉数据库脚本,这样要是有人更新了数据库,其他同事不一定能够收到最新的通知,使用了 Flyway 就可以有效避免这个问题了。
- 所有的脚本,一旦执行了,就会在 flyway_schema_history 表中有记录,如果你不小心搞错了,可以手动从 flyway_schema_history 表中删除记录,然后修改 SQL 脚本后再重新启动(生产环境不建议)。
# Flyway配置
- 在 Spring Boot 中,关于 Flyway 也有不少配置,这些配置都在 application.properties 中进行配置,常用的几个来和大家说下:
- spring.flyway.enabled:是否开启 flyway,默认就是开启的
- spring.flyway.encoding:flyway 字符编码
- spring.flyway.locations:sql 脚本的目录,默认是 classpath:db/migration,如果有多个,用 , 隔开
- spring.flyway.clean-disabled:这个属性非常关键,它表示是否要清除已有库下的表,如果执行的脚本是 V1__xxx.sql,那么会先清除已有库下的表,然后再执行脚本,这在开发环境下还挺方便,但是在生产环境下就要命了,而且它默认就是要清除,生产环境一定要自己配置设置为 true。
- spring.flyway.table:配置数据库信息表的名称,默认是 flyway_schema_history。