SpringBoot 应用 flyway

前言

商务网站开发入门这门选修课已经结课了,学生的作业也提交了有一段时间了,出分迫在眉睫,这次评阅采用了多人阅卷的方式,相较于作业系统之前由一个人批阅作业的方式,公平了不少,作业状态由原来的已评阅和未评阅改为未评阅、评阅中、已评阅,表示评阅的字段由reviewed改为status,由于要在数据表层面直接操作,因此要用到SQL语句,当时第一想法是在实体类里加status字段,然后在仓库层手写SQl,判断reviewed属性为1(评阅完成)的,status赋值为2(已评阅),其他的均为0,直到老师提到flyway,我才知道还有这么神奇的工具。

flyway

说来也巧,在老师提到flyway二十分钟之前,我看到了黄庭祥学长写的关于flyway的博客:flyway数据库管理,也许这就是缘分吧,当时好像要查一些关于SQL的东西,依稀记得学长写过,虽说到最后没找到,但是却阴差阳错发现了这个,虽说没咋看明白,但是感觉也挺好。
image.png
进入flyway官网,首先展示的是一段话:

数据库的版本控制。
跨所有环境的健壮的模式演化。
轻松,愉快和朴素的SQL。

对于flyway,有的博客是这样介绍的:

Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。

第一次成功运行会生成一个名为"flyway_schema_history"的数据表,之后进行管理都是基于该表
其工作原理如下:
image.png

配置应用flyway

首先在pom.xml文件中引入依赖:

    
        
            org.flywaydb
            flyway-core
        

这部分是没有写全的,因为不同的Spring版本引入的依赖是不一样的,之前也没了解过,真的不知道每个Spring版本都对应一个稳定的依赖包,后来看了喜硕学长关于flyway的博客:flyway 实践,才知道竟然有这种事,对于这种现象,学长是这样解释的:

spring-boot项目依赖于 spring-boot-dependencies项目,该项目中管理了所有被 spring-boot整合过的技术的版本号。
去文件内搜索 flyway,即找到相关的配置 5.0.7
spring-boot规定好了,如果你用的是 spring-boot 2.0.5.RELEASE版本,那建议使用 flyway:5.0.7


这样管理一是方便,还有一个原因我觉得是避免冲突。
当引入多个包的时候,就可能会出现版本冲突,我相信,spring-boot肯定是将这些版本经过测试的,保证了无冲突才会推荐使用这些版本的。

然后我找到了依赖文件,找到flyway对应的版本:
image.png
然后添加到依赖中即可:


        
            org.flywaydb
            flyway-core
            6.0.8
        

然后配置application.yaml的flyway字段:

flyway:
    enabled: true
    baseline-on-migrate: true
    baseline-version: 1
    check-location: true
 enabled表示是否开启flywary
 
baseline-on-migrate表示当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.

baseline-version表示开始执行基准迁移时对现有的schema的版本打标签,默认值为1.

check-location表示检查迁移脚本的位置是否存在,默认false.

接下来,就是引入SQL文件,在resources文件下新建db文件,在db文件中新建migration(迁移)文件,这是flyway默认的检索路径,接下来就是导出数据库,转储SQL文件,导出:

这样是为了进行版本控制,便于后续的执行,此后的命名版本号都不得低于该版本,如果后续还要进行其他操作,只需新建文件,然后编写SQL即可。
点击运行,查看数据库里的 flyway_schema_history 表单,有对应版本的SQL文件成功执行的记录
image.png

值得注意的是,启用flyway之后,hibernate的ddl-auto属性要改为validate,即验证,当实体定义的字段类型与SQL表里的不同或者不存在时,会终止程序运行,防止字段出现冲突导致程序出现大问题。

总结

之后要想对字段进行修改,不仅要修改实体字段,还要编写SQL,进行版本的迁移,一篇好的博客,真的让观看的人恍然大悟,看了喜硕学长的博客,真的明白了好多,还顺利的把flyway应用到了系统中,在此特别表达对喜硕学长的感谢。

本文作者:河北工业大学梦云智开发团队 张文达

你可能感兴趣的:(flyway,springboot)