在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作。在实现这个例子的时候,我们事先在MySQL中创建了用户表。创建表的过程我们在实际开发系统的时候会经常使用,但是一直有一个问题存在,由于一个系统的程序版本通过git得到了很好的版本控制,而数据库结构并没有,即使我们通过Git进行了语句的版本化,那么在各个环境的数据库中如何做好版本管理呢?下面我们就通过本文来学习一下在Spring Boot中如何使用Flyway来管理数据库的版本。

Flyway简介

Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。

官方网站:https://flywaydb.org/

本文对于Flyway的自身功能不做过多的介绍,读者可以通过阅读官方文档或利用搜索引擎获得更多资料。下面我们具体说说在Spring Boot应用中的应用,如何使用Flyway来创建数据库以及结构不一致的检查。

动手试一试

下面我们可以通过对使用JdbcTemplate一文中的例子进行加工完成。读者也可以拿任何一个与数据访问相关的工程来做如下内容的实验:

  • 第一步,在pom.xml中增加flyway的依赖:
  • <dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>5.0.3</version>
    </dependency>

      

    第二步,按Flyway的规范创建版本化的SQL脚本。

  • 在工程的src/main/resources目录下创建db目录
  • db目录下创建版本化的SQL脚本V1__Base_version.sql
  • 第三步,在application.properties文件中配置Flyway要加载的SQL脚本位置。按第二步创建的结果配置如下:
    flyway.locations=classpath:/db
  • 第四步,执行单元测试ApplicationTests,此时我们在日志中可以看到如下信息:
    INFO 82441 --- [main] o.f.core.internal.util.VersionPrinter    : Flyway Community Edition 5.0.3 by Boxfuse
    INFO 82441 --- [main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
    INFO 82441 --- [main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.022s)
    INFO 82441 --- [main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table: `test`.`flyway_schema_history`
    INFO 82441 --- [main] o.f.core.internal.command.DbMigrate : Current version of schema `test`: << Empty Schema >>
    INFO 82441 --- [main] o.f.core.internal.command.DbMigrate : Migrating schema `test` to version 1 - Base version
    WARN 82441 --- [main] o.f.core.internal.sqlscript.SqlScript : DB: Unknown table 'test.user' (SQL State: 42S02 - Error Code: 1051)
    INFO 82441 --- [main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema `test` (execution time 00:00.128s)

      

    Flyway监测到需要运行版本脚本来初始化数据库,因此执行了V1__Base_version.sql脚本,从而创建了user表,这才得以让一系列单元测试(对user表的CRUD操作)通过。

  • 第五步,我们可以继续再执行一下单元测试,此时我们会发现日志输出与之前不同:
    INFO 83150 --- [main] o.f.core.internal.util.VersionPrinter    : Flyway Community Edition 5.0.3 by Boxfuse
    INFO 83150 --- [main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
    INFO 83150 --- [main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.031s)
    INFO 83150 --- [main] o.f.core.internal.command.DbMigrate : Current version of schema `test`: 1
    INFO 83150 --- [main] o.f.core.internal.command.DbMigrate : Schema `test` is up to date. No migration necessary.

      

    由于在第四步的时候,初始化脚本已经执行过,所以这次执行就没有再去执行V1__Base_version.sql脚本来重建user表。

  • 第六步,我们可以尝试修改一下V1__Base_version.sql脚本中的name字段长度,然后在运行一下单元测试,此时我们可以得到如下错误:
    ERROR 83791 --- [main] o.s.boot.SpringApplication               : Application startup failed
    
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1
    -> Applied to database : 466264992
    -> Resolved locally : -270269434

    由于初始化脚本的改动,Flyway校验失败,认为当前的V1__Base_version.sql脚本与上一次执行的内容不同,提示报错并终止程序,以免造成更严重的数据结构破坏。

  • 源码来源

Spring Boot教程(四十)使用Flyway来管理数据库版本的更多相关文章

  1. 使用Flyway来管理数据库版本

    使用Flyway来管理数据库版本 Flyway是什么 Flyway是一款数据库迁移(migration)工具. 它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减 ...

  2. Spring Boot教程(十六)属性配置文件详解(1)

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...

  3. Spring Boot中使用Flyway来管理数据库版本

    flyway是一个开源的数据库迁移工具.类似于数据库的版本控制工具.flyway的数据库修改文件默认放在resource下的db.migration文件夹中,以V{version_number}__{ ...

  4. Spring Boot教程(十四)快速入门

    快速入门 本章主要目标完成Spring Boot基础项目的构建,并且实现一个简单的Http请求处理,通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单.开发快速的特性. 系统要求: ...

  5. Spring Boot教程(十五)使用Intellij中的Spring Initializr来快速构建Spring Boot/Cloud工程

    在之前的所有Spring Boot和Spring Cloud相关博文中,都会涉及Spring Boot工程的创建.而创建的方式多种多样,我们可以通过Maven来手工构建或是通过脚手架等方式快速搭建,也 ...

  6. Flyway:Spring Boot中使用Flyway来管理数据库版本

    Flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate.clean.info.validate.baseline.repair等命令.它支持SQL(PL/ ...

  7. Spring Boot教程(三十三)使用Redis数据库(1)

    Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elasticsearch, So ...

  8. Spring Boot教程(十九)RESTful API单元测试

    下面针对该Controller编写测试用例验证正确性,具体如下.当然也可以通过浏览器插件等进行请求提交验证. @RunWith(SpringJUnit4ClassRunner.class) @Spri ...

  9. Spring Boot教程(十八)构建RESTful API

    首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...

随机推荐

  1. shiro过滤器机制

    shiro内置过滤器介绍 https://blog.csdn.net/qq_35608780/article/details/71703197 Shiro的Filter机制详解---源码分析 http ...

  2. 【原创】大叔经验分享(56)hue导出行数限制

    /opt/cloudera/parcels/CDH/lib/hue/apps/beeswax/src/beeswax/conf.py # Deprecated DOWNLOAD_CELL_LIMIT ...

  3. 动画方案 Lottie 学习(二)之实战

    代码 $('.success-info-title').append('<p class="normal_finish" id="normal_finish_ani ...

  4. git创建库

    WMW@WMWGO MINGW64 /f $ cd e:               # 切换到 E 盘 WMW@WMWGO MINGW64 /e $ mkdir learngit      # 创建 ...

  5. vue导航栏制作

    1,在components新建commnn目录,然后再新建nav目录,在此目录下新建nav-bottom.vue文件和nav-item.vue文件 2,nav-bottom.vue中的内容: < ...

  6. Redis-Set常用命令

    Redis-Set常用命令 Set与List的区别在于,Set保存的队列数据是不重复的,且无序 sadd key value- 在指定key对应的集合中添加 value集合,如果key不存在,即新创建 ...

  7. 第十五章、线程之queue模块的各种队列

    目录 第十五章.线程之queue模块的各种队列 一.Queue 二.LifoQueue堆栈 三.PriorityQueue优先级队列 第十五章.线程之queue模块的各种队列 一.Queue impo ...

  8. 【Day2】3.面向对象编程

    课程目标 1. 面向对象编程 2. 类和实例 3. 访问限制 4. 实例属性和类属性 面向对象编程 • 面向对象编程是一种程序设计思想 • 面向对象把类和对象作为程序的基本单元 • 对象包含属性和方法 ...

  9. 蓝牙App漏洞系列分析之二CVE-2017-0639

    蓝牙App漏洞系列分析之二CVE-2017-0639 0x01 漏洞简介 Android本月的安全公告,修复了我们发现的另一个蓝牙App信息泄露漏洞,该漏洞允许攻击者获取 bluetooth用户所拥有 ...

  10. 1.python环境安装

    一:安装Python与环境配置 二:安装pip 三:Anaconda安装和使用 3.1 什么是 Anaconda? Anaconda是专注于数据分析的Python发行版本,支持 Linux, Mac, ...