Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration.php
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。java
官方网站:flywaydb.org/git
关于flyway的更多介绍信息请移步google一下。spring
在平常的开发中,咱们使用git管理代码的版本,那么数据库的版本呢?使用flyway。sql
我的认为,能够大概的将flyway理解为数据库的git,方便多人协做及记录。数据库
git:让你和同事更加轻松的维护同一个项目,你能够很方便的获取到他最新提交的改动。springboot
flyway:让你及时的知道同事对数据库的改动而且可以自动在你的本地执行这些改动。bash
我所经历的项目大部分是已经配置好flyway的,也习惯了这一便利。服务器
最近新上手一个项目,和另外一个同事一块儿维护,此项目没有配置flyway,所以经历了如下两种状况:app
1.同事对数据库作了改动而且代码合并到线上(我并不参与review),以后我拉取线上代码,链接本地数据库启动项目,报错,缘由是本地没有新添加的数据表,而项目启动依赖于他。
2.我在完成一个需求以后,打算将代码上线,须要在代码合入以前手动去线上(去服务器上或者经过phpmyadmin等工具)执行sql建立数据表。
这是什么反人类操做???不怕我将create写错成drop吗?
所以我忍无可忍,昨晚下班后加班了半个小时,给该项目添加了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
来保存版本数据。
我以为很好用,他成功解决了个人如下痛点。
和同事同时维护一个项目,同时对数据库作出了一些修改,我在使用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认为当前的数据库是一个已经执行过的版本,不作任何的改动,后续的改动继续添加便可。
schemas_version
中对应记录从新执行便可。(反正在开发环境无所谓的,咱们又不会去生产环境执行错误的sql)。总结:flyway是个好东西,强烈建议spring boot项目都进行配置,能够节省许多时间及避免不少因联合开发带来的麻烦问题。
完。
以上皆为我的所思所得,若有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文连接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见我的博客------>呼延十