什么是flyway
Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration.
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
官方网站:flywaydb.org/
关于flyway的更多介绍信息请移步google一下。
为什么要使用flyway
在日常的开发中,我们使用git管理代码的版本,那么数据库的版本呢?使用flyway。
个人认为,可以大概的将flyway理解为数据库的git,方便多人协作及记录。
git:让你和同事更加轻松的维护同一个项目,你可以很方便的获取到他最新提交的改动。
flyway:让你及时的知道同事对数据库的改动并且能够自动在你的本地执行这些改动。
我遇到的问题
我所经历的项目大部分是已经配置好flyway的,也习惯了这一便利。
最近新上手一个项目,和另一个同事一起维护,此项目没有配置flyway,因此经历了以下两种情况:
1.同事对数据库做了改动并且代码合并到线上(我并不参与review),之后我拉取线上代码,连接本地数据库启动项目,报错,原因是本地没有新添加的数据表,而项目启动依赖于他。
2.我在完成一个需求之后,打算将代码上线,需要在代码合入之前手动去线上(去服务器上或者通过phpmyadmin等工具)执行sql创建数据表。
这是什么反人类操作???不怕我将create写错成drop吗?
因此我忍无可忍,昨晚下班后加班了半个小时,给该项目添加了flyway的依赖。
springboot 集成 flyway
1.项目添加依赖
Maven:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.3</version>
</dependency>
Bazel:
//在deps中添加
"//third_party/java:org_flywaydb_flyway_core",
2.在application.properties
文件中加入以下内容:
#flyway
#打开flyway
flyway.enabled=true
flyway.encoding=utf-8
#sql文件存放位置
flyway.locations=classpath:db/migration
#版本记录表格
flyway.table=schemas_version
flyway.baseline-on-migrate=true
flyway.validate-on-migrate=false
其中重要的三项配置已经添加注释,其他的配置可以百度自行修改。
3.上文配置的路径classpath:db/migration
下添加sql文件,
命名格式为:

其中V之后的数字代表了当前版本,一般采用递增的形式,不可以重复。
但是可以选择多种形式,比如V1,V2
或者V1.1,V1.2
等等。
4.在数据库中新建该数据库,注意是全新的库,启动项目,项目在启动时flyway会自动执行所有的sql文件,并新建一张数据表schemas_version
来保存版本数据。
flyway好用吗?
我觉得很好用,他成功解决了我的以下痛点。
-
和同事同时维护一个项目,同时对数据库做出了一些修改,我在使用git拉取了最新的代码之后,运行总是报错,需要自己去重新执行一遍该表的创建语句来在本地进行创建,使用flyway后,拉取最新代码的同时会拉取最新的sql文件,同时在服务启动时自动创建数据表,对一些和自己无关的数据表完全不用关心了。
-
新接手一个项目,在本地进行开发调试,本地新建数据库后,需要执行一遍建表语句,使用flyway可以自动的创建该项目的所有表格。
-
换电脑,我日常开发使用一台台式机及一台笔记本,紧急情况使用家中笔记本进行一些开发,在每次新换电脑时都需要重新创建一遍数据库的表,十分的麻烦。使用flyway的遍历同第二点(可以理解为换电脑等于在新电脑上运行新项目)。
注意事项
-
上面的教程并没有很详细的介绍flyway的具体各项配置,日常使用copy上面的配置改动有注释的三项即可,有其他需要可以自行百度。
-
上述教程是在新项目中使用flyway,那么可不可以为已有的项目添加flyway依赖呢?当然可以。
为已有项目添加依赖方法(此方法为个人使用,应该有其他更方便可靠的办法,欢迎讨论):
flyway是依靠什么判断版本呢?使用过一次之后你就知道,是根据数据库中schemas_version
表的记录。
你每次执行过一次sql文件,在该表中就会添加一条类似于
V13 success
的数据。
当项目启动时,flyway扫描sql文件,发现当前有V14
开头的文件,同时数据库中没有V14执行的记录,那么就会执行该文件。
你可以将当前数据库的所有表格创建语句导出到sql文件,然后新建V1__init_database.sql
文件,将所有创建语句copy到该文件中,然后创建新库,连接新库启动项目,之后copy新库中schemas_version
数据表的结构及数据,添加到已有的数据库中,这样项目启动时便不会对已有的数据库产生影响。
这波操作的本质是:模仿一条记录,让flyway认为当前的数据库是一个已经执行过的版本,不做任何的改动,后续的改动继续添加即可。
- 有时会写入错误的sql语句,修改后再次执行便会报错显示数据库中已有该版本的记录,此时进入数据库删除
schemas_version
中对应记录重新执行即可。(反正在开发环境无所谓的,我们又不会去生产环境执行错误的sql)。
总结:flyway是个好东西,强烈建议spring boot项目都进行配置,可以节省许多时间及避免很多因联合开发带来的麻烦问题。
完。
ChangeLog
2018-10-10 完成以上皆为个人所思所得,如有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文链接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见个人博客------>呼延十