Flyway的简单介绍及使用详解

 更新时间:2020年8月16日 14:55  点击:1550

一、开发时管理数据库遇到的问题:

现在开发一般都是团队开发,这样就会出现项目同步的问题,代码同步可以通过SVN工具管理起来,那数据库同步怎么办呢?理想的情况下,在开发新项目的时候会首先把业务理清楚,把数据库表设计好,然后将数据库交给专门的人员维护,也就不存在数据库同步的问题了。但实际情况呢?需求从项目开始到项目结束一直在变,很多公司就没有专门的数据库维护人员,数据库大家都在操作,都在修改,如果团队之间沟通及时还好,大家每次更新代码后顺便也更新一下数据库,如果沟通不及时,呵呵(大家自行脑补)。。。这样数据库不同步的问题就凸显出来了。

二、Flyway 的简单介绍:

1、概念:

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像SVN管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

2、支持的数据库类型:

Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。

3、sql脚本的命名规范:

V+版本号(版本号的数字间以"."或"_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:V2017.9.30__Update.sql。

注:版本号不能相同!

4、Flyway读取sql脚本的默认位置:

项目的源文件夹下的db/migration目录。

5、指令:

一共就6个基本指令:migrate、clean、info、validate、baseline、repair。

三、Flyway 的优势:

1、不仅支持sql 脚本,还支持Java 代码直接操作数据库(flyway-core-x.x.x.jar);

2、有Maven 插件;

3、支持命令行;

4、与Spring 框结合,很方便地实现应用启动时自动检查并升级数据库的功能。

四、Flyway命令行工具的使用:

1、解压下载flyway-commandlin 版本并解压到本地,结构图如下:

  

  2、将sql脚本放在Flyway默认的db/migration目录下,如果放在其他位置需要修改conf/flyway.conf文件中的flyway.locations。

3、根据自己的情况修改conf/flyway.conf文件中的flyway.url、flyway.user、flyway.password。

4、在命令行执行migrate命令。

五、与Maven项目结合使用:

1、引入依赖坐标:

<!-- flyway -->
 <dependency>
 <groupId>org.flywaydb</groupId>
 <artifactId>flyway-core</artifactId>
 <version>4.2.0</version>
 <dependency> 

2、在src/main/resources目录下建立存放sql版本文件的路径dataBase/sqlite(也可以写默认路径db/migration),并将sql文件放在下面。

3、增加flyway的java类:

package com.xxxxxx.flyway;
 
 import javax.sql.DataSource;
 import org.flywaydb.core.Flyway;
 
 public class MigrationSqlite {
 
 private DataSource dataSource;
 
 public void setDataSource(DataSource dataSource) {
 this.dataSource = dataSource;
 }
 
 public void migrate() {
 //初始化flyway类
 Flyway flyway = new Flyway();
 //设置加载数据库的相关配置信息
 flyway.setDataSource(dataSource);
 //设置存放flyway metadata数据的表名,默认"schema_version",可不写
 flyway.setTable("SCHMA_VERSION");
 //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径,默认"db/migration",可不写
 flyway.setLocations("dataBase/sqlite");
 //设置sql脚本文件的编码,默认"UTF-8",可不写
 flyway.setEncoding("UTF-8");
 
 flyway.migrate();
 }
 }

4、在spring中实例化第3步的java类:

<bean id="MigrationSqlite" class="com.xxxxxx.flyway.MigrationSqlite" init-method="migrate">
 <property name="dataSource" ref="dataSource"></property>
 </bean>

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

5、处理Flyway 更新数据库和代码逻辑操作数据库时的冲突(自己目前没遇到,网上找到的,先留着备不时之需):

如果Flyway 还在更新数据库,没有完成更新操作之前,应用程序的其他逻辑已经开始使用数据库进行其他操作了,会导致应用程序产生很多bug ,甚至根本运行不起来。要解决这个问题,我们可以利用Spring 的bean 依赖原理,让关键的数据库操作bean 依赖于flywayMigration 这个bean ,达到在flywayMigration 没有实例化完成(数据库更新操作完成)之前,不能进行任何其他数据库相关操作。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="MigrationSqlite">
 <property name="dataSource" ref="dataSource" />
 </bean>

这样,每次启动项目时就会自动更新数据库,不必在为数据库不同步烦恼了。

参考文章:

1、https://flywaydb.org/documentation/ (官网)

2、http://casheen.iteye.com/blog/1749916

3、http://shuzheng5201314.iteye.com/blog/2044517

4、https://www.jb51.net/article/191708.htm

到此这篇关于Flyway的简单介绍及使用的文章就介绍到这了,更多相关Flyway的简单介绍及使用内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02
  • Postman安装与使用详细教程 附postman离线安装包

    这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • vs2019安装和使用详细图文教程

    这篇文章主要介绍了vs2019安装和使用详细图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25