Flyway
是一个数据库版别办理东西,能够十分简略的将数据库的schema
从一个版别搬迁到别的一个版别,而且支撑MySql,Oracle,Postgre
等多种联系型数据库
What is Flyway
Flyway
主要便是通过搬迁(Migration
)来对数据库进行版别的控制,对于Flyway
而言在数据库上的一切操作都能够称之为搬迁;Flyway
有两种搬迁方法:版别化搬迁(Versioned Migration
)和可重复的搬迁(Repeatable Migration
)
Versioned Migrations
Flyway
的版别化搬迁有两种方法:
- 常规的版别晋级(
Regular
) - 版别吊销回退(
Undo
)
版别化搬迁包括一个版别,描绘和checksum
;版别是仅有的,描绘是用来告知他人这个版别履行了什么操作,校验和(checksum)
用于查看当时履行脚本是否有改变,假如有改变那么就会履行失利,由于版别化搬迁中一切的sql
脚本只会履行一次
Repeatable Migration
可重复搬迁包括一个描绘(description
)和一个校验和(checksum
),但没有版别;在可重复搬迁中,只需它的校验和(checksum
)发生改变就会履行,校验和便是脚本文件的内容改变
在单次的搬迁操作中,假如一起存在Versioned Migration
和Repeatable Migration
,那么优先按版别顺序履行Versioned Migration
等一切的版别搬迁履行之后,才会履行Repeatable Migration
Migration Format
默许的情况下,版别化搬迁和可重复搬迁能够用SQL
或Java
编写,而且能够包括多个句子;目前Flyway
也支撑用脚本语言进行搬迁,目前支撑.ps1
, .bat
, .cmd
, .sh
, .bash
, .py
等脚本
SQL-Based Migration
常用的搬迁方法便是根据sql
的搬迁,由于这很容易就能够掌握,而且不需求学习其他的知识,而且能够灵敏的满足各种需求
根据SQL
搬迁的文件有如下的命名规矩:
文件名由如下几部分组成:
- 前缀:
V
表明版别化,U
表明吊销回退,R
表明可重复搬迁 - 版别:版别一般为数字,多个数字之间用点分割,比方:
V1.1,V1
等 - 分隔符:
__
双下划线 - 描绘:表明当时脚本履行的操作类型
- 后缀:
.sql
上面的这些组成部分都是能够进行装备的,假如想装备能够参考这个文档
Java-Based Migration
根据java
搬迁是为了更好的满足不易于sql
履行的搬迁操作,比方:
- 二进制数据的更改
- 批量数据的更改
根据java
搬迁的脚本文件和根据SQL
搬迁的脚本文件有一些不同:
根据java
的搬迁没有了后缀,其他的都是类似的,具体可参考!Flyway文档
Flyway
会主动的在文件系统和java classpath
中查找搬迁文件;为了追踪搬迁的状况Flyway
会在数据库的当时schema
中增加表flyway_schema_history
对每次搬迁进行记录
Why Flyway
为什么需求Flyway
呢?下面咱们通过一个例子来简略的说明咱们为什么需求Flyway
,以及Flyway
到底能帮咱们处理什么问题
假设,现在咱们有一个项目:Shiny
,该项目连接了一个数据库:Shiny DB
,它们作为一个全体进行交给;用一个简略的示意图表明为:
在项目的开发周期中,会一起有多个开发者参加到项目,项目完结之后还需求进行继续集成,测验,然后上线到出产,整个流程的示意图能够简略的表明为如下这样:
在整个交给的过程中:
- 咱们有代码版别控制东西
git
,确保交给的代码和本地共同 - 咱们有
docker
能够打包运用环境,依靠确保和咱们本地有相同的构建环境 - 而且还有
DockerHub
之类的镜像仓库来办理镜像版别
但数据库呢?怎么才干确保本地履行的脚本和出产的共同呢
现在很多项目仍是依靠手动履行脚本,但这会引起一些问题:
- 当时机器上的运用对应的数据库处在什么状况(也便是,履行了那些
sql
脚本,又有那些没履行) - 当时的脚本是应该履行仍是不应该履行呢
- 在出产中快速修正的问题是否在后面的测验中运用了呢
- 怎么去布置一个新的数据库实例呢
其实大多数的时分,咱们底子不知道,由于一般一个运用会有很多人操作,但是底子没人会记录当时数据库所在的状况,以致于一点改动都需求花很长的时间去查看,布置
Flyway
作为数据搬迁东西很好的处理了这种混乱的状况,它能够让你:
- 很快的从头创立一个数据库实例
- 清楚的知道当时数据库所在的状况
- 以一种确认的方法从当时一个版别搬迁到一个新的版别
SpringBoot With Flyway
在SpringBoot
中引入Flyway
是十分方便的,首先是增加Flyway
和相关的依靠;假如运用Maven
能够在pom.xml
文件中增加如下装备:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
假如运用Gradle
能够在build.gradle
中增加如下的依靠装备
compile('org.flywaydb:flyway-core')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-web')
compile('mysql:mysql-connector-java')
接下来便是在application.properties
中增加数据库和Flyway
相关的装备
spring.application.name = flywayapp
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000
flyway.baselineOnMigrate= false
flyway.outOfOrder= false
flyway
相关的装备能够在官方文档中查看
由于flyway
默许是在resource/db/migration
目录下查找脚本文件,所以咱们在这个目录下创立脚本文件进行数据库的搬迁,命名为:V1__Initial.sql
,增加如下的sql
句子
CREATE TABLE USERS (ID INT AUTO_INCREMENT PRIMARY KEY, USERID VARCHAR(45));
INSERT INTO USERS (ID, USERID) VALUES (1, 'tutorialspoint.com');
在SpringBoot
中装备了Datasource
之后,当程序发动的之后就会主动注入到Flyway
中,所以完结如上的装备之后就能够发动程序进行验证了
参考连接:
flywaydb.org/documentati…
www.tutorialspoint.com/spring_boot…#