1、使用它之前先要了解一些概念:

版本:对数据库的每一次变更可称为一个版本。

迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移。

可用的迁移:Flyway的文件系统识别出来的迁移版本。

已经应用的迁移:Flyway已经对数据库执行过的迁移。

2、flyway最基本的几个命令。

Migrate:应用所有的迁移到最新版本,它会在你的DB中新建个表schema_version来存放每次升级的版本信息。

Clean:clean all objects

Info:打印所有的迁移的信息以及状态。

Validate:迁移之前进行验证。

Baseline:初始化schema_version表,并插入一条原始verion=1。

Repair:它主要做了两件事,移除所有失败的迁移(升级),重置校验和。

3、既支持sql方式升级也支持java方式升级

1、持SQL(还有PL/SQL,T-SQL)文件的方式进行升级(这就是最原始的方式,但是得按照一定的规则规则,例如: V1_0_1__create.sql。

sql脚本的命名规则:

prefix: default:V (大写)

version: 版本号也可以使用大小版本组合的方式,小版本号用单 _区分

separator: 分隔符,双下划线 __

description: 描述(必须要有意义)

suffix: 后缀 default:  .sql

2、当然也支持Java方式,继承 JdbcMigration即可。

4、可以使用命令行客户端command-lineclient来执行命令来升级数据库的版本。这个在这就不介绍了,以后会拓展。重点在介绍java的使用。

5、当然flyway也提供了插件支持.

有如下插件支持:Maven, Gradle,SBT和Ant,还有更多Plugins,提供对Spring Boot, Dropwizard, Grails, Play,Griffon, Grunt, Ninja 的支持。其中可以研究下flyway-test-extensions,有Usage flyway dbunit test、Usage-flyway-spring-test 功能很强大。

6、在maven项目里面的spring mvc里面使用flyway在系统启动的时候去检查并升级数据库的版本。

6.1、引入flyway的jar包,在pom.xml里面内容如下:

<!-- flyway依赖 -->

<dependency>

<groupId>org.flywaydb</groupId>

<artifactId>flyway-core</artifactId>

<version>3.0</version>

</dependency>

6.2、编写数据库的版本的脚本文件,放到src/main/resources的flyway里面:

(flyway找脚本的时候默认去src/mian/resources下面的db/migration,如果要放

在别的位置,后面的地方要配置一下)

6.3、定义在应用启动时自动运行Flyway的Java 类,并实现其逻辑代码

package com.ibm.flyway;

importjavax.sql.DataSource;

importorg.flywaydb.core.Flyway;

import org.flywaydb.core.api.FlywayException;

public classFlywayMigration {

private DataSource dataSource;

public void setDataSource(DataSourcedataSource) {

this.dataSource = dataSource;

}

public void migrate() {

Flyway flyway = new Flyway();

flyway.setDataSource(dataSource);

flyway.setLocations("db/migration"); // 设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径(表示是src/main/resources/flyway下面,前缀默认为src/main/resources,因为这个路径默认在classpath下面)

flyway.setEncoding("UTF-8");  // 设置sql脚本文件的编码

flyway.setOutOfOrder(true);

//flyway.setDataSource(dataSource);

//flyway.setSchemas("flywaydemo"); // 设置接受flyway进行版本管理的多个数据库

//flyway.setTable("schema_version"); // 设置存放flyway metadata数据的表名

//flyway.setValidationMode(ValidationMode.ALL); // 设置执行migrate操作之前的validation行为

//flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 设置当validation失败时的系统行为

// 设置当validation失败时的系统行为

try {

flyway.setInitOnMigrate(true);

flyway.migrate();

} catch (FlywayException e) {

flyway.repair();

e.printStackTrace();

}

}

}

6.4、设置在系统启动是自动运行FlywayMigration类的migrate方法

在ApplicationContext.xml(spring mvc的上下文中加入如下:)

<!-- flayway-->

<beanid="flywayMigration1" class="com.ibm.flyway.FlywayMigration" init-method="migrate">

<property name="dataSource"ref="dataSource" />

</bean>

从上面的bean 定义中我们可以看到,我们为flywayMigration 这个bean 实例注入了一个数据源,Flyway 的所有操作将针对这个数据源进行;同时我们通过init-method 属性指定了Spring 在实例化该bean 以后,主动执行该bean 的migrate 方法,而该方法内会执行Flyway 更新数据库的操作。

至此,我们达到了在应用启动时,Spring 实例化上下文的时候,在Spring 实例化flywayMigration 这个bean 的时候,自动执行Flyway 更新数据库的操作。

但是,我们还没有达到目的,万一Flyway 还在更新数据库,没有完成更新操作之前,应用程序的其他逻辑已经开始使用数据库进行其他操作了,会导致应用程序产生很多bug ,甚至根本运行不起来。

要解决这个问题,我们可以利用Spring 的bean 依赖原理,让关键的数据库操作bean 依赖于flywayMigration 这个bean ,达到在flywayMigration 没有实例化完成(数据库更新操作完成)之前,不能进行任何其他数据库相关操作。

利用Spring 的bean 依赖让flywayMigration 优先处理数据库更新操作:

<!-- 将连接池注入到 JdbcTemplate对象 -->

<beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"depends-on="flywayMigration1">

<property name="dataSource"ref="dataSource"></property>

</bean>

至此,运行就可以了。

但是值得注意的是:

在启动的tomcat的时候,内容如下:

但是在schema_version里面已经执行过的版本号如下:

如果存在V1_0_0__create.sql这个脚本时,是不会执行这个的,而是会执行V1_0_1__create.sql,因为schema_version表的version为1其实被flyway默认为v1_0_0_0版本了,所以没有执行。原因是schema_version表的version为1其实被flyway默认为v1_0_0版本了,所以没有执行,而version版本为表示初始化schema_version。也就是说版本号只要不一样就会执行。

注意:sql脚本的命名规则一定要准确,按照格式去命名。

flyway的使用的更多相关文章

  1. 生产环境中,数据库升级维护的最佳解决方案flyway

    官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1.  引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...

  2. Flyway, 数据库Schema管理利器

    整天跟数据库打交道的程序员都知道,当数据库的Schema发生改变时是多么痛苦的事情.尤其是一个在不断开发完善的项目,随着需求变化,数据库的schema也会跟着变化,而追踪记录这些变化一向都是费时费力. ...

  3. Spring Boot项目使用Flyway

    Purpose 开发人员在合作的时候经常遇到以下场景: 1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上.此时 ...

  4. 快速掌握Flyway

    什么是Flyway? Flyway is an open-source database migration tool. It strongly favors simplicity and conve ...

  5. Spring Boot flyway的启动时机比较早

    flyway,如果已经创建的版本V1中已经更新,则会validation报错 at org.springframework.boot.devtools.restart.RestartLauncher. ...

  6. How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  7. Java敏捷数据库迁移框架——Flyway

    1.引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的一种解决方案,当时各个环境的数据库乱作一团,没有任何一个人(开发.测试.维护人员)能够讲清楚当前环境下的数据库是哪个版本,与哪个版本的应 ...

  8. 数据库版本管理工具Flyway(4.0.3)---工作机制(译文)

    How Flyway works The easiest scenario is when you point Flyway to an empty database. 最容易的方案是Flyway指向 ...

  9. 数据库版本管理工具Flyway(4.0.3)---介绍(译文)

    Flyway Evolve your Database Schema easily and reliably across all your instances 简单的.可靠的升级(发展)你的数据库模 ...

  10. 微服务架构 - SpringBoot整合Jooq和Flyway

    在一次学习分布式跟踪系统zipkin中,发现了jooq这个组件,当时不知这个组件是干嘛的,后来抽空学习了一下,感觉这个组件还挺用的.它主要有以下作用: 通过DSL(Domain Specific La ...

随机推荐

  1. .NET 6 中的HTTP 3支持

    dotnet团队官方博客发布了一篇HTTP3的文章:HTTP/3 support in .NET 6:https://devblogs.microsoft.com/dotnet/http-3-supp ...

  2. 手机UI自动化之显示点触位置(触摸轨迹)

    上期回顾:Airtest源码分析--Android屏幕截图方式 不管是用Appium还是Airtest,或是其他手机UI自动化工具,你是不是经常遇到这种情况,代码明明执行了click或swipe,怎么 ...

  3. Webpack的配置项

    Webpack配置选项 ​ 经历了考研以后,接下来的时间里准备捡起来这些以前学的东西,并且继续向着前端的方向出发,给自己多一条路的选择.话不多说,直接开始. moudule.exports = { / ...

  4. 传说中 VUE 的“语法糖”到底是啥?

    一.什么是语法糖? 语法糖也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语.指的是计算机语言中添加的一种语法,在不影响功能的情况下,添加某种简单的语 ...

  5. 深入HTML5第二天

    sub(subscripted下标标签)和sup(superscripted上标标签) 内联元素:inline element  span(范围标签):内联元素inline element 特性:没有 ...

  6. 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 百篇博客分析OpenHarmony源码 | v19.03

    百篇博客系列篇.本篇为: v19.xx 鸿蒙内核源码分析(位图管理篇) | 谁能一分钱分两半用 | 51.c.h .o 先看四个宏定义,进程和线程(线程就是任务)最高和最低优先级定义,[0,31]区间 ...

  7. 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 百篇博客分析OpenHarmony源码 | v3.05

    百篇博客系列篇.本篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁的贡献最大 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度 ...

  8. Jmeter压测学习1—第一个项目:登录

    我用的是我们公司的测试环境练习的 网址:http://****:9000/login.html  账号是admin 密码:123456 一.打开Jmeter 找到安装目录:bin->Jmeter ...

  9. Winform 实现图片轮播(解决Image.FromFile内存不足)

    前言 最近项目中需要在winform中做一个类似于网页那种轮播的效果,这里做下记录. 实现 整体的实现思路如下: 读取图片文件夹. 建立一个集合存储Image对象. 定时器定时更换PictrueBox ...

  10. 原生JS实现简单留言板功能

    原生JS实现简单留言板功能,实现技术:css flex,原生JS. 因为主要是为了练手js,所以其中布局上的一些细节并未做处理. <!DOCTYPE html> <html lang ...