本文的目的是介绍SpringBoot整合数据库版本管理工具flyway的详细情况,特别关注入门的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解SpringBoot整合
本文的目的是介绍SpringBoot整合数据库版本管理工具flyway的详细情况,特别关注入门的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解SpringBoot整合数据库版本管理工具flyway的机会,同时也不会遗漏关于Flyway 一个方便集成的数据库版本管理工具、Flyway让数据库版本管理更简单、Flyway详解以及Springboot集成Flyway(转)、Flyway:Spring Boot 中使用 Flyway 来管理数据库版本的知识。
本文目录一览:- SpringBoot整合数据库版本管理工具flyway(入门)(springboot整合springdatajpa)
- Flyway 一个方便集成的数据库版本管理工具
- Flyway让数据库版本管理更简单
- Flyway详解以及Springboot集成Flyway(转)
- Flyway:Spring Boot 中使用 Flyway 来管理数据库版本
SpringBoot整合数据库版本管理工具flyway(入门)(springboot整合springdatajpa)
代码Demo地址:https://github.com/shileishmily/spring-boot-jooq-demo.git
Flyway是什么
Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。
如果你和我一样,有开发环境,测试环境,RC环境,生产环境,还有为某些渠道商户定制搭建的环境。那么哪怕是增加一个字段,你都必须在各个环境执行一遍。如何改动较大,
比如某一个开发版本增加了10张表,修改了N表的注释,字段长度等等等等。想想头就大了,就算天天想,时时想。最后上生产环境还是会有遗漏。
现在有了flyway,一切变得轻松。
1、添加gradle依赖
buildscript {
ext {
springBootVersion = ''1.5.9.RELEASE''
}
repositories {
maven { url ''http://maven.aliyun.com/nexus/content/groups/public/'' }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("org.flywaydb:flyway-gradle-plugin:5.0.7")
}
}
apply plugin: ''java''
apply plugin: ''idea''
apply plugin: ''org.flywaydb.flyway''
apply plugin: ''org.springframework.boot''
dependencies {
compile group: ''org.flywaydb'', name: ''flyway-maven-plugin'', version: ''5.2.4''
compile group: ''org.flywaydb'', name: ''flyway-core'', version: ''5.0.7''
}
2、application.yml配置
spring:
profiles:
active: dev
aop:
auto: true
proxy-target-class: true
datasource:
url: jdbc:mysql://localhost:3306/jooq_test?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
username: root
password: 111
driver-class-name: com.mysql.jdbc.Driver
jooq:
sql-dialect: mysql
flyway:
clean-disabled: true #禁用clean操作
enabled: true #使flyway生效
baseline-on-migrate: true #初始化时如果不存在迁移记录表,默认新建一个
out-of-order: true #防止开发环境下漏掉没来得及apply的文件,产品环境最好设为false
locations: classpath:/db/migration
3、/db/migration/V1__init_database.sql文件,新增一张表sys_log
CREATE TABLE `sys_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip_address` varchar(50) DEFAULT NULL COMMENT ''ip地址'',
`oper_id` int(11) DEFAULT NULL COMMENT ''操作人ID'',
`user_name` varchar(50) DEFAULT NULL COMMENT ''用户名'',
`module_name` varchar(50) DEFAULT NULL COMMENT ''模块名称'',
`method_name` varchar(50) DEFAULT NULL COMMENT ''方法名'',
`method_desc` varchar(100) DEFAULT NULL COMMENT ''方法描述'',
`oper_content` varchar(6000) DEFAULT NULL COMMENT ''操作内容'',
`create_time` datetime DEFAULT NULL COMMENT ''创建时间'',
`app_id` int(11) DEFAULT NULL COMMENT ''应用ID'',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4、首次执行需要在数据库实例jooq_test创建表flyway_schema_history,flyway_schema_history是flyway版本控制记录表,必须要创建。
CREATE TABLE `flyway_schema_history` (
`installed_rank` int(11) NOT NULL,
`version` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`type` varchar(20) NOT NULL,
`script` varchar(1000) NOT NULL,
`checksum` int(11) DEFAULT NULL,
`installed_by` varchar(100) NOT NULL,
`installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`execution_time` int(11) NOT NULL,
`success` tinyint(1) NOT NULL,
PRIMARY KEY (`installed_rank`),
KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
5、启动SpringBoot程序JooqApplication,启动时会自动执行数据库脚本文件。
package com.suixingpay.jooq;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = {"com.suixingpay.jooq"})
public class JooqApplication {
public static void main(String[] args) {
SpringApplication.run(JooqApplication.class, args);
}
}
6、登录数据库查询发现多了两张表
sys_log是我们在V1__init_database.sql中新增的表;
flyway_schema_history是flyway版本控制记录表;
查询表flyway_schema_history,可以看到刚才执行V1__init_database.sql脚本的记录已经有了。
代码Demo地址:https://github.com/shileishmily/spring-boot-jooq-demo.git
Flyway 一个方便集成的数据库版本管理工具
首先把官方的特性贴出来, 简明意概:
Flyway 的特性
* 自动升级(自动发现更新项):Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行,可以通过Ant 脚本执行,通过Maven 脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如在应用启动时执行)。
* 规约优于配置:Flyway 有一套默认的规约,所以不需要修改任何配置就可以正常使用。
* 既支持SQL 脚本,又支持Java 代码:可以使用SQL 脚本执行数据库更新,也可以使用Java 代码来进行一些高级数据升级操作。
* 高可靠性:在集群环境下进行数据库升级是安全可靠的。
* 支持清除已存在的库表结构:Flyway 可以清除已存在的库表结构,可以从零开始搭建您的库表结构,并管理您的数据库版本升级工作。
* 支持失败修复。新的2.0 版本提供了repair 功能,用于解决数据库更新操作失败问题
简单说, 上面的特性不难理解,flyway 是通过版本号来控制自动升级的功能,通过约定来默认实现配置,通过SQL 脚本实现数据库更新控制。SQ脚本和JAVA代码本身不和平台有关,故可实现高可用。通过约定的版本号控制SQL脚本的执行,则可以清除已存在的库表结构。
我个人比较倾向不和JAVA相关联,将Flyway 视为一种运维的工具, 故更推荐使用SQL脚本。
以下是官方的目录结构:
比较清晰,只要对应申明 目录结构即可。不一定要放在 migration 下面。
我个人常用gradle 做打包和集成工具,故这里写一下简单的flyway在gradle 中的应用方式。
首先在build.gradle中,引入flyway 插件(插件开发比较容易,会一点groovy 就行了。这里具体不展开)
官方引入方式:
plugins {
id "org.flywaydb.flyway" version "4.0"}
我比较常用的引入方式:
apply plugin: ''org.flywaydb.flyway''
//配置插件仓库
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.flywaydb:flyway-gradle-plugin:3.2.1"
}
}
随后就是在build.gradle里面声明 flyway 参数了
ext{
def prop = new Properties();
file(" src/main/resources/jdbc -mysql.properties").withInputStream {
prop.load(it)
}
prop.each {
project.extensions.add("$it.key",it.value);
}
}
flyway {
user = project[''jdbc.user'']
url= project[''jdbc.url'']
password = project[''jdbc.pass'']
locations=["filesystem:db/migration"]
}
比较倾向以上的读取方式,使用单独的 配置文件,管理数据库的配置。
最后整理一下SQL的命名方式即可:
1。版本集成:
前缀用V,随后跟随 版本号, 版本号之间用 单一下划线表示。 后面跟随2个下划线,后面跟随具体的描述。最后是后缀
2。可重复的集成 :
前缀用R,随后跟随2个下划线,后面跟随具体的描述,最后是后缀
注意起步的版本号是 从1_0_0 开始的,故SQL脚本编码可以写1_0_1开始。
最后就是执行了,
首先执行 flywayBaseline 在数据库中建立 schema_version表,建立基础的版本信息,随后 执行 flywayMigrate 进行数据库脚本执行。
贴一下具体的tasks:
flywayMigrate:应用所有的迁移到最新版本,它会在你的DB中新建个表
schema_version
来存放每次升级的版本信息。flywayClean:clean all objects
flywayInfo:打印所有的迁移的信息以及状态。
flywayValidate:迁移之前进行验证。
flywayBaseline:初始化
schema_version
表,并插入一条原始verion=1。flywayRepair:它主要做了两件事,移除所有失败的迁移(升级),重置校验和。
第一个OSChina 的文章写完了,没有花多少时间, 但觉得还是挺满足的。
Flyway让数据库版本管理更简单
Flyway是什么
随着项目CICD接入,一键启动,敏捷开发已经成为降本提效的不二法宝,其中涉及SQL的变更还不够智能和自动化,因此亟需一款工具能够帮助开发及运维人员高效简便地完成SQL变更,Flyway正是可以满足我们需求的一款工具。
当我们打开Flyway的官网,在首页可以看到关于Flyway的一段英文介绍:
Flyway是数据库的版本控制,跨所有环境的稳健架构演变。轻松、愉快和简单的SQL。
总的来说,Flyway是一款专为CI/CD打造的,能对数据库变更做版本控制的工具。
Flyway支持的数据库很多,主流的数据库都能够完美支持,官网摘抄如下:
Supported databases are Oracle, SQL Server (including Amazon RDS and Azure SQL Database), Azure Synapse
(Formerly Data Warehouse), DB2, MySQL (including Amazon RDS, Azure Database & Google Cloud SQL), Aurora MySQL,
MariaDB, Percona XtraDB Cluster, TestContainers, PostgreSQL (including Amazon RDS, Azure Database, Google Cloud
SQL, TimescaleDB, YugabyteDB & Heroku), Aurora PostgreSQL, Redshift, CockroachDB, SAP HANA, Sybase ASE,
Informix, H2, HSQLDB, Derby, Snowflake, SQLite and Firebird.
Flyway解决的问题
在项目或产品研发过程中,很难一开始就把业务理清楚,把代码逻辑和数据库表设计好,因此代码和数据表也会在迭代周期内不断迭代。我们都习惯使用SVN或者Git来对代码进行版本管理,主要是为了解决多人开发代码冲突和版本回退的问题。
其实,数据库的变更也需要版本控制,在日常开发和环境部署中,我们经常会遇到下面的问题:
- 在开发环境部署程序发现报错,定位是自己写的SQL脚本忘了在当前环境执行导致;
- 从Git上新down下来的代码运行报错,定位发现是其他同事修改了的SQL脚本没有在当前环境执行导致;
- 每次发布包都需要发布SQL文件包和应用程序的版本包;
- 线上环境部署报错,发现是运维没有按照你投产文档里面说明的SQL脚本执行顺序操作执行导致;
- 流水线可以自动化部署程序,但是SQL脚本还是需要手动执行或者流水线执行SQL脚本配置比较繁琐;
- 其他场景....
有了Flyway,这些问题都可以轻松的解决。Flyway可以对数据库进行版本管理,可以自动执行SQL,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的;
Flyway主要工作流程
Flyway工作流程如下:
1、项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。
2、初次使用时,Flyway会创建一个flyway_schema_history表,用于记录sql执行记录。
3、Flyway会扫描项目指定路径下(默认是classpath:db/migration)的所有sql脚本,与flyway_schema_history表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。
4、如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。
在SpringBoot项目使用Flyway
Flyway既支持使用客户端command-lineclient命令行方式也支持JAVA API方式升级数据库,本文只介绍JAVA API以Maven引入插件方式的使用,更多方式可以查看官网;
引入依赖
在start.spring.io上新建一个SpringBoot工程,引入数据库驱动依赖等,同时引入Flyway的依赖,这个步骤比较简单,不做过多说明(本文示例使用的是Mysql数据库);
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.14.0</version><!-- 截至发稿前,官网最新版本是7.14.0 -->
</dependency>
添加Flyway配置
spring:
# 数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/xukj_flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
username: flyway
password: xxx
flyway:
# 是否启用flyway
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀,默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baseline-on-migrate: true
创建SQL脚本
项目创建以后,在src/resources下有 db/migration(或db.migration)目录,在其中创建对应的SQL文件,基于约定由于配置的原则,不同的类型通过文件命名方式进行区分
Flyway对数据库的所有更改都称为迁移;版本迁移(Versioned Migrations)以V开头,只会执行一次;回退迁移(Undo Migrations)以U开头,执行一旦发生破坏性更改,就会很麻烦,项目中一般不用;可重复执行迁移(Repeatable Migrations)以R开头,每次修改后都会重新执行。
总结如下:
- 仅需要被执行一次的SQL命名以大写的"V"开头,后面跟上"0~9"数字的组合,数字之间可以用“.”或者下划线"_"分割开,然后再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,V2020.00.000_1__create_table.sql,V202001.00.000_2__insertTable.sql,V2.1.5__create_table.sql。
- 可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,R__addTable.sql,R__update_user.sql。
- 版本号需要唯一,否则Flyway执行会报错;如果V__脚本.sql,已经执行过了,不能修改里面的内容,再次执行Flyway就会报错。R——脚本.sql,如有变化可以执行多次。
- V开头的SQL执行优先级要比R开头的SQL优先级高。
如下,我们准备了三个脚本,分别为:
1、V2020.00.000_1__create_table.sql,代码如下,目的是创建一张表,且只执行一次
CREATE TABLE `test_flyway_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''主键'',
`time` datetime NOT NULL COMMENT ''创建时间'',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2、V202001.00.000_2__insertTable.sql,代码如下,目的是往表中插入一条数据,且只执行一次
INSERT INTO `test_flyway_table` VALUES (''1'', ''2021-06-28 17:48:48'');
3、R__addTable.sql,代码如下,目的是每次启动如果有变化,则执行一次
update `test_flyway_table` set time = ''2021-08-23 17:48:48'' where id =1;
对应目录截图如下:
运行
按照上面配置完成,已经足够我们开始运行了,此时,我们第一次启动项目,如果配置没有错误,运行截图如下:
此时,我们刷新数据库,可以看到Flyway的历史记录表已经生成并插入了三个版本的记录:
而且,表也已经创建好了并有一条数据:
此时不做任何改变,重启程序,日志如下:
日志显示表没有变化,不做变更,查看两张表的内容也无变化。
如果我们修改V202001.00.000_2__insertTable.sql脚本,重启程序,就会报错,提示信息如下:
Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
Migration checksum mismatch for migration version 202001.00.000.2
-> Applied to database : 1190158040
-> Resolved locally: 843339817. Either revert the changes to the migration, or run repair to update the schema history.
如果我们修改R__addTable.sql脚本,重启程序,脚本会再次执行,并且Flyway的历史记录表也会增加本次执行的记录。
Flyway的执行效率
为了验证Flyway项目数据库迭代了较久时间,积累了几百个Sql以后是否会拖慢项目的启动速度?进行了一个对照组试验:
场景(sql文件控制在10K以内) | 执行平均时长(单位:秒) |
---|---|
放1个已经被执行过的SQL脚本,反复启动项目 | 11.1 |
放25个已经被执行过的SQL脚本,反复启动项目 | 11.4 |
放50个已经被执行过的SQL脚本,反复启动项目 | 11.6 |
放100个已经被执行过的SQL脚本,反复启动项目 | 12.19 |
脚本在历史记录表中有记录,即使有几百条SQL脚本,每次项目启动只执行单次迭代的脚本,所以耗时主要来源于两个方面:
- Flyway依次读取脚本中内容时的IO开销;
- Flyway计算脚本checksum值的算法开销;
对于IO开销而言,每个脚本如果不是涉及大量的数据变更,只是表结构的变更,脚本的大小都非常小,可以不考虑.事实上Flyway也不适合大量的数据变更时使用,因此IO开销对启动耗时的增量基本可以忽略
Flyway计算checksum值采用的是著名的CRC32(循环冗余校验码)算法,该算法是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。为了验证算法计算效率,做了如下试验:
场景 | 执行平均时长(单位:毫秒) |
---|---|
读取一个超大文件,约1M,并进行计算,反复执行多次 | 48 |
读取一个正常大小的SQL脚本,约10K,并进行计算,反复执行多次 | 4 |
由此可见,即便是有上百个正常大小的sql,计算checksum值也不会耗费太多的时间,基本都可以在1秒内完成,所以接入Flyway后也不必担心会有历史包袱。
Flyway详解以及Springboot集成Flyway(转)
Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里;不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复。
Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;
sql脚本的格式:V+版本号 +双下划线+秒速+结束符
例如:V1__INIT_DATABASE.sql
上面的V 是默认值, 可以通过
flyway.sql-migration-prefix来指定前缀 ,
Migrate:
Migrate是指把数据Schema迁移到最新版本,在Migrate时会检查MetaData元数据表,如果不存在就创建MetaData表,MetaData用于记录数据库历史变更等信息;
Migrate会扫描指定文件系统或者classpath下的Migrations。会与MetaData中的记录进行对比,进行版本升级;
Clean:清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用;
Info:用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本;
validate:验证以及apply的Migrations是否有变更,默认开启的;原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败。
BaseLine:对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以应用到已有表结构的数据库中也可以实现添加Metadata表。
repair:repair操作能够修复metaData表,该操作在metadata出现错误时很有用
用途:
1):移除失败的Migration记录,只针对不支持DDL事务的数据库
使用Flayway:
1、引入flyway的依赖:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.0.3</version>
</dependency>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.0.3</version>
</plugin>
2、新建一个maven的Springboot项目,在配置文件中配置数据源信息:
server.port=8088
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3、在classpath下新建/db/migration文件夹,并创建sql脚本文件:
use testdb;
CREATE TABLE person (
id int(11) NOT NULL AUTO_INCREMENT,
first varchar(100) NOT NULL,
last varchar(100) NOT NULL,
dateofbirth DATE DEFAULT null,
placeofbirth varchar(100) not null,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into person (first,last,dateofbirth,placeofbirth) values(''Dursun'',''KOC'', STR_TO_DATE(''02/10/1982'', ''%m/%d/%Y''),''Erzincan'');
insert into person (first,last,dateofbirth,placeofbirth) values(''Durseeun'',''KeeOC'', STR_TO_DATE(''05/10/1982'', ''%m/%d/%Y''),''Erzeeincan'');
4、启动springboot项目:
加载了sql脚本 。
5、查看数据库:
生成了flyway-schema-history表,这个版本默认是这个表,如果想自己指定schema表的命,可以设置:
flyway.tableflyway
6:flyway的一些其他配置:
flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.
————————————————
版权声明:本文为CSDN博主「Jennire_Q」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiuhao9527/article/details/81070482
Flyway:Spring Boot 中使用 Flyway 来管理数据库版本
Flyway 简介
Flyway 是一个简单开源数据库版本控制器(约定大于配置),主要提供 migrate、clean、info、validate、baseline、repair 等命令。它支持 SQL(PL/SQL、T-SQL)方式和 Java 方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT 等)。
官方网站:https://flywaydb.org/
下面我们可以通过对使用 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
DROP TABLE IF EXISTS user ;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''主键'',
`name` varchar(20) NOT NULL COMMENT ''姓名'',
`age` int(5) DEFAULT NULL COMMENT ''年龄'',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 第三步,在
application.properties
文件中配置 Flyway 要加载的 SQL 脚本位置。按第二步创建的结果配置如下:
flyway.locations=classpath:/db
flyway.baselineOnMigrate=true
flyway.enabled=false
- 第四步,执行单元测试
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
脚本与上一次执行的内容不同,提示报错并终止程序,以免造成更严重的数据结构破坏。
文章转载至:http://blog.didispace.com/spring-boot-flyway-db-version/
关于SpringBoot整合数据库版本管理工具flyway和入门的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Flyway 一个方便集成的数据库版本管理工具、Flyway让数据库版本管理更简单、Flyway详解以及Springboot集成Flyway(转)、Flyway:Spring Boot 中使用 Flyway 来管理数据库版本等相关内容,可以在本站寻找。
本文标签: