Flyway 是什么?

Flyway是个数据库版本管理工具。在开发过程中,数据库难免发生变更,例如数据变更,表结构变更、新建表或者视图等等。

在项目进行时无法保证一旦开发环境中的数据库内容变化候会去测试环境去更新数据库。

即使开发环境有变化不同时去测试环境执行,那么也需要保留所有的SQL脚本,待开发完成再去测试环境一一执行。

然后去生产环境又要去执行。

如果SQL脚本数量不多还可以接受,一旦数量过多,一个个脚本执行也是相当费时。

Flyway就用作解决此类问题。接下来的内容是在Maven中整合Flyway工具。

如果不想和Maven一起用,Flyway也有命令行、API、Gradle等方式,具体点击这里。

接下来开始正片!

开始前准备

此文使用的Flyway 5.2.4版本,Java环境和Maven的安装不再赘述,对应Java和Maven版本如下:

环境:

  Java 8, 9, 10 or 11

  Maven 3.x

编辑器:

  IDEA

数据库:

  MySQL

环境安装好之后需要新建一个Maven项目。

这里使用数据库是MySQL,如果不是MySQL也可以按照此文做,

不同的就是连接数据库的URL和数据库驱动,当然还有一些特定的配置也会不一样,但是没什么影响。

一切准备就绪之后开始Flyway的配置,以新建Person表为例。

整合Flyway

第一步

在Maven项目中引入框架或者插件或者其他工具,第一步就是修改pom.xml,引入相关的资源。

这里引入Flyway插件。

    <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--引入Flyway插件-->
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
<configuration>
<!--数据库连接URL-->
<url>jdbc:mysql://localhost:3306/dbtrial?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC</url>
<!--数据库连接用户名-->
<user>root</user>
<!--数据库连接密码-->
<password>123</password>
<!--指定数据库-->
<schemas>dbtrial</schemas>
<!--指定如果flyway_schema_history表不存在则新建-->
<baselineOnMigrate>true</baselineOnMigrate>
</configuration>
</plugin>
</plugins>
</build>

注意:因为在pom.xml 字符 “&” 被认作特殊字符,所以这里用 “&amp;”

   <schemas>dbtrial</schemas>此配置是为了指定数据库中脚本在那个数据库下面执行。

     flyway_schema_history 表使用来记录执行日志的,下图是表中记录的内容,

     第一条是创建日志表,第二条是执行项目里面的SQL脚本(当然这是Flyway执行成功后才能看到的,现在提前贴出来方便理解):

   

 

  因为在创建项目时选择的是web项目,并且选了使用MySQL数据库所以已经有了MySQL的数据库驱动。

如果没有,则需要在pom.xml中添加依赖

        <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

第二步

pom.xml修改完成之后,接下来需要准备要执行的SQL脚本。

但是在新建SQL脚本之前需要先在项目中创建一个文件夹存放脚本文件。

路径:\src\main\resources\db\migration

注意:这里在创建文件夹时,Flyway默认的就是上面的路径。(虽然配置也可以修改,但是新学不建议搞得太复杂)

然后在创建好的路径下面新建SQL脚本文件

路径:\src\main\resources\db\migration\V1.1__CreatePersonTable.sql注意:文件的命名要使用推荐的格式如用V1.0、V1.1、V1.x这种格式。好处在于,

Flyway对脚本文件的命名非常敏感,格式不对可能会报错,再者就是利于查看,看文件名就能知道版本先后。

版本号后面一定要跟两个下划线。否则一直会报错文件名格式不正确。

目录结构:

SQL脚本:

create table PERSON (
ID int not null,
NAME varchar(100) not null
);

第三步

万事俱备只欠东风,最后我们需要做的就是让Flyway执行起来,自动更新数据库。

打开terminal,然后输入命令:

  

执行之后的输出信息:

然后查看数据库:

总结

入门级文章,如有错误或者疑问欢迎指出。

Flyway的功能很强大,支持市面上非常多的数据库。

能同时执行不同数据库的脚本,支持事务等等。

深入用法可以访问官网。

Flyway - Version control for your database的更多相关文章

  1. which type of VS files should be committed into a version control system

    which type of VS files should be committed into a version control system? aps, no: last resource edi ...

  2. xcode svn commit is not under version control (1) & git commit

    使用Xcode提交一个第三方库时,由于包含资源文件,总是提交不了,提示报错:XXX commit is not under version control (1) 网上查了下,得知 xcode对于sv ...

  3. svn: warning: 'xxxxxx' is already under version control

    [root@NGINX-APACHE-SVN pm]# svn status ? plugins ? files ? images ? data ? resources [root@NGINX-APA ...

  4. svn is already under version control问题解决

    svn ci 时出现 xx is already under version control,然后无法提交,出现这个问题的原因是你所提交的文件或目录是其他SVN的东西,即下面有.svn的目录,需要先把 ...

  5. Git&Version Control

    Git Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1]  Git 是 Linus Torvalds 为了帮助管理 Linux 内 ...

  6. Version Control/Git,SVN

    一.Version Control 1.什么是Version Control 版本控制(Version Control)是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置 ...

  7. xcode svn commit is not under version control 和 git常用指令

    使用Xcode提交一个第三方库时,由于包含资源文件,总是提交不了,提示报错:XXX commit is not under version control (1) 网上查了下,得知 xcode对于sv ...

  8. version control的简单认知

    version control 版本控制是一种记录文件或文件集随时间变化的系统,以便您以后可以调用特定版本.对于本书中的示例,您将使用软件源代码作为受版本控制的文件,但实际上您可以使用计算机上的几乎任 ...

  9. 【转】svn:is not under version control and is not part of the commit, yet its child解决办法

    来自:http://blog.csdn.net/lufeng20/article/details/7641093 在把写好的代码提交到svn上面时,遇到了一个错误如下: svn: Commit fai ...

随机推荐

  1. HBase版本进化史及大版本特性

    HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...

  2. Javascript连续赋值

    Javascript对象属于引用类型,将对象赋值给变量相当于将对象地址赋值给变量 let a = {n: 1}; let b = a; a.x = a = {n: 2}; //运算符的优先级 cons ...

  3. Python安装和使用教程(windows)

    点击进入幕布视图浏览 https://mubu.com/doc/a8VGCUfqqw 一.Python下载 1.进入Python官网:https://www.python.org/ 2.选择windo ...

  4. react textArea 高度不变化问题

    ref={el =>{ if(el){ el.textareaRef.style.height = el.textareaRef.scrollHeight + 'px'; } } }

  5. JMeter 常用网站

    1.jmeter插件 https://blog.csdn.net/weixin_39430584/article/details/80947093 http://www.doc88.com/p-214 ...

  6. 在三台服务器,搭建redis三主三从集群

    一.资源准备 1.准备三台服务器H1.H2.H3 172.26.237.83 H1 172.26.237.84 H2 172.26.237.85 H3 二.配置服务器 1.在H1服务器设置SSH免密登 ...

  7. Linux常用命令入门

    在Linux早期的版本中,由于不支持图形化操作,用户基本上都是使用命令行方式来对系统进行操作.掌握常用 的一些Linux命令是非常有必要的,下面将分类进行介绍.由于篇幅有限,在这里我们介绍命令时有些不 ...

  8. Shiro学习(4)INI配置

    之前章节我们已经接触过一些INI配置规则了,如果大家使用过如spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根 ...

  9. BZOJ 3238: [Ahoi2013]差异((单调栈+后缀数组)/(后缀树))

    [传送门[(https://www.lydsy.com/JudgeOnline/problem.php?id=3238) 解题思路 首先原式可以把\(len\)那部分直接算出来,然后通过后缀数组求\( ...

  10. 一些DP杂题

    1. [HNOI2001] 产品加工 一道简单的背包,然而我还是写了很久QAQ 时间范围是都小于5 显然考虑一维背包,dp[i]表示目前A消耗了i的最小B消耗 注意 if(b[i]) dp[j]=dp ...