Purpose
开发人员在合作的时候经常遇到以下场景:
1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发人员B拉取了A的代码改动,在运行项目的时候很可能会报错,因为B的本地SQL数据库并没有修改。
2.在项目上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运行SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。
传统的解决方案就是在一个固定的文件夹中,将需要跑的SQL脚本放在里面。开发人员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通一下,去跑需要的脚本。在项目上线的过程中,也是运维人员在规定的文件夹中,找到需要跑的SQL脚本。运行它们。
Flyway等migration工具就是要把开发人员和运维人员从以上这些场景的繁琐工作中解放出来,如果使用maven的话,那么在项目编译(SpringBoot运行Application)的时候,SQL数据库的改动就自动进入数据库,只要启动成功,开发或者运维人员对SQL数据库的migrate过程是无感知的,项目依然可以照常运行。
Technical Background
To read and practice this document, user ought to be able to develop projects via git, SpringBoot and MySQL.
Instructions - Run Demo
1.下载demo源码:
git clone https://git.oschina.net/dreamingodd/spring-boot-flyway-demo.git
2.使用Intellij或Eclipse import existing maven project。
3.在本地mysql console中运行:
create database flyway_test;
use flyway_test;
4.修改配置文件,将username和password改成本地MySQL数据库的。
5.运行FlywayTestApplication类。
6.在mysql console中运行
show tables;
即可看到以下结果:
(schema_version表保存了数据库版本信息,哪些脚本已经被执行,先不用管)
7.一张demo表被自动创建出来了。
What Happened
以上过程是如何实现的呢?
Flyway在maven项目编译(SpringBoot运行Application)的时候,自动扫描resources/db/migration目录下的文件,
打开V1_demo.sql:
就是刚刚自动运行的SQL脚本。添加脚本的话,依次使用V2__XXX.sql,V3__XXX.sql,以此类推,脚本中使用正常的SQL语句即可,没有任何学习负担。
这样,在开发人员合作以及项目部署的时候,Flyway就起到了加强自动化部署、实践持续交付等作用。
Instruction - Use in Current Project
那么如何在已经开发了一段时间的项目中使用Flyway呢?
1.Maven配置
<dependency> <groupId>org.flywaydbgroupId> <artifactId>flyway-coreartifactId> <version>4.0.3version> dependency>
<plugin> <groupId>org.flywaydbgroupId> <artifactId>flyway-maven-pluginartifactId>
<version>4.0.3version> plugin>
2.application.properties配置
flyway.baselineOnMigrate=true
如果是application.yml,则为
flyway.baselineOnMigrate: true
3.在resources/db/migration中添加V1__XXX.sql,mvn compile(运行Application)即可看到SQL脚本运行结果。(注意V1后面是两个下划线)
Appendix
1.出现错误的解决方法:
如果你的SQL脚本运行失败,到schema_version表中删除最新一条数据,
比如我故意写一个错误的SQL语句到V2__demo2.sql,运行mvn compile(运行Application)。
可以看到最新一条的success列为false。
如果部分成功了,要手动rollback,修改SQL脚本正确后再次mvn compile(运行Application)。
2.更多信息请访问官网:https://flywaydb.org/
dreamingodd原创文章,如转载请注明出处。