引言
Flyway
是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
通常在项目上线后,由于需求的不断改进或功能的完善需要对个别字段进行调整或新增。如果采用传统方式直接修改开发和生产数据库但凡涉及人为操作总无法避免出错的可能。一种方法是避免直接修改数据库,所有数据库修改通过PDM去操作。当然毕竟PDM是花钱的,通过采用Flyway
编写变更脚本的方式,可以使应用在启动时检查数据库变更并进行自动同步。
版本
- Flyway: 5.1.4
- Gradle: 4.10
- Spring Boot: 2.0.4
步骤
Flyway对数据库进行版本管理主要由Metadata表和6种命令完成,Metadata主要用于记录元数据,在Flyway首次启动时会创建默认名为flyway_schema_history
的元数据表,该表用于记录版本变更日志、Checksum等信息。
Flyway脚本的命名规则如下:
- prefix: 可配置,前缀标识,默认值
V
表示Versioned,R
表示Repeatable - version: 标识版本号,由一个或多个数字构成,数字之间的分隔符可用点
.
或下划线_
- separator: 可配置,用于分隔版本标识与描述信息,默认为两个下划线
__
- description: 描述信息,文字之间可以用下划线或空格分隔
- suffix: 可配置,后续标识,默认为
.sql
要实现在Spring boot
中使用Flyway
进行版本管理需要做到如下步骤:
1. 添加依赖
2. 来点配置
3. 编写脚本
这里示例以一个存在若干张表的数据库为例,为该库添加一张新的test_alpha
表,然后追加一列bravo
。
1.添加依赖
1 | compile "org.flywaydb:flyway-core:5.1.4" |
2.来点配置 application.yaml
1 | # flyway配置 对于非空数据库 需要开启此项避免报错 |
3.准备脚本
依据上文描述的命名规则,在src\main\resources\db\migration
下添加你的数据库变更脚本,这里需要注意的是,由于我们是在非空数据库进行操作,所以这里的版本号是从v2
开始。
V2__Add_new_table.sql
1 | DROP TABLE IF EXISTS flyway_test_alpha; |
V3__Add_column.sql
1 | ALTER TABLE `flyway_test_alpha` |
现在启动你的应用,你会发现这两项操作会隐士完成了,实在是非常省心。
附录: Flyway配置详解
1 | flyway.baseline-description= # 执行基线时标记已有Schema的描述 |