1、什么是Flyway?
Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
Flyway主要基于6种基本命令:Migrate
, Clean
, Info
, Validate
, Baseline
and Repair
,稍候会逐一分析讲解。目前支持的数据库主要有:Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL(including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix.
关于Flyway的优势,支持的数据库以及与其他数据库版本工具的对比,可以阅读Flyway官网介绍。
2、为什么使用Flyway?
通常在项目开始时会针对数据库进行全局设计,但在开发产品新特性过程中,难免会遇到需要更新数据库Schema的情况,比如:添加新表,添加新字段和约束等,这种情况在实际项目中也经常发生。那么,当开发人员完成了对数据库更的SQL脚本后,如何快速地在其他开发者机器上同步?并且如何在测试服务器上快速同步?以及如何保证集成测试能够顺利执行并通过呢?
假设以Spring Boot技术栈项目为例,可能有人会说,本地使用Hibernate自动更新数据库Schema模式,然后让QA或DEV到测试服务器上手动执行SQL脚本,同时可以写一个Gradle任务自动执行更新。
个人觉得,对于Hibernate自动更新数据库,感觉不靠谱,不透明,控制自由度不高,而且有时很容易就会犯错,比如:用SQL创建的某个字段为VARCHAR类型,而在Entity中配置的为CHAR类型,那么在运行集成测试时,自动创建的数据库表中的字段为CHAR类型,而实际SQL脚本期望的是VARCHAR类型,虽然测试通过了,但不是期望的行为,并且在本地bootRun或服务器上运行Service时都会失败。另外,到各测试服务器上手动执行SQL脚本费时费神费力的,干嘛不自动化呢,当然,对于高级别和PROD环境,还是需要DBA手动执行的。最后,写一段自动化程序来自动执行更新,想法是很好的,那如果已经有了一些插件或库可以帮助你更好地实现这样的功能,为何不好好利用一下呢,当然,如果是为了学习目的,重复造轮子是无可厚非的。
总而言之,在Springboot项目中集成flyway,可以使项目中对数据库的操作的更加透明化,便于我们后期对数据进行优化,由于开发阶段需要频繁进行数据库迁移,flyway提供了很大的便利,它不仅可以帮我们像hibernate一样自动生成表结构,还可将一些索引、存储过程进行迁移,除此之外,它还提供了良好了数据库的版本控制。
3、flyway在springboot项目中的使用
一、引入相关的jar包,我用的gradle,如下:
compile ('org.flywaydb:flyway-core:5.1.4')
二、在resources目录下,创建db/migration路径,创建V1.0.0__init.sql文件,需要注意命名,该sql文件中主要存放我们的建表语句,如下:
image.png
#我这里用的postgrel数据库
CREATE TABLE IF NOT EXISTS "t_mm_device_model" (
"id" bigserial NOT NULL,
"description" varchar(255) COLLATE "default",
"dev_clusterid" varchar(255) COLLATE "default",
"deviceid" varchar(255) COLLATE "default",
"device_name" varchar(255) COLLATE "default",
"feature" jsonb,
"model_version" varchar(255) COLLATE "default",
"property" jsonb,
CONSTRAINT "t_mm_device_model_pkey" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE);
三、若是新的工程,上述配置就可以跑通,若是已经在开发的项目,那就相当于数据库迁移,你需要将数据库以前的表现删掉,然后在application.properties中添加:
spring.flyway.baselineOnMigrate=true
并将hibernate
然后启动项目,既可运行成功。如果不想 Flyway 执行,可以配置不启用 Flyway,
参考链接:https://blog.waterstrong.me/flyway-in-practice/
更多信息请访问官网:https://flywaydb.org/
网友评论