Flyway使用说明
Flyway简介
Flyway是源自Google的数据库版本控制插件。项目开发中,数据库往往需要随着软件版本进行变化,相比起手动执行SQL脚本,flyway可以实现自动化的数据库版本修改,让开发/测试等环境的部署更加Easy。例如:
模块A从版本1.0.0升级到1.2.0,需要在student表中添加2个字段并赋予默认值。
- 传统方式:升级模块A时,需要运维大佬同时执行ddl脚本修改表字段+dml脚本赋予默认值,否则程序会报错。如果环境比较多,那么部署其实是一个比较麻烦的事。
- Flyway:把对数据库做修改的sql放入到flyway的目录,模块A升级后,启动时会自动执行sql脚本,运维无需关心数据库的改动。
Flyway使用简介
Flyway基本原理
Flyway的核心就是db.migrate这个文件夹和flyway_schema_history表。db.migrate下每个sql文件对应flyway_schema_history的一条记录。
如下图:

Flyway会在数据库中维护一张flyway_schema_history表。如下图:

表中字段说明:
- installed_rank 脚本执行编号,自动累加
- version 数据库版本号,由用户定义(后续会解释)
- description 版本修改说明,用户编写
- type 脚本类型,一般都是SQL
- script 脚本文件名
- checksum 这是对脚本文件进行CRC32运算得到的数值,用以确保已经执行过的sql脚本不会再发生变化
- installed_by 脚本运行的DB用户
- installed_on 脚本运行时间
- execution_time 脚本执行耗时(ms)
- success 脚本是否执行成功
当引入了flyway的项目启动时,运行flyway.migrate()方法(Spring Boot引入会自动执行),Flyway会将db.migrate文件夹中的sql脚本和数据库flyway_schema_history表做对比,当检测到db.migrate中存在版本号大于flyway_schema_history最新版本的SQL脚本时,就会执行脚本,并更新flyway_schema_history表。
Flyway默认约定
Flyway遵循约定大于配置的原则,有一些默认的约定,按照约定创建脚本,flyway就可以自动识别并执行。
| 属性 | 约定 | 说明 |
|---|---|---|
| 版本控制表 | flyway_schema_history | 数据库中版本控制的表名,默认就是flyway_schema_history,可配置 |
| 脚本路径 | db/migrate | 默认SQL脚本的存放路径,是相对于classPath的相对路径 |
| 脚本文件命名规则 | V/R__.sql | 这是Flyway约定的脚本文件命名。 |
脚本文件命名规则
Flyway的脚本文件命名有以下规则:
首先是大写字母 V/R,然后是版本号,要是有小版本可以用下划线隔开,例如 2_1,版本号后面是两个下划线,然后是脚本名称,文件后缀是 .sql。
- 以V或者R开头
- V表示这个脚本是版本控制脚本,只会执行一次,如果在执行之后修改该脚本,则运行flyway.migrate()时flyway会报错(checksum校验失败);
- R表示这是个可重复运行脚本,每次修改这个脚本,flyway.migrate()执行时都会再次执行这个脚本;
- 版本号
版本号之间如果有小版本,以下划线隔开 - 版本修改说明
版本号和版本修改说明之间以两个下划线隔开,版本说明的单词之间以下划线隔开
例如V1_0_0_3__change_thing_parent_to_code.sql,则是说明这是一个版本号为1.0.0.3的数据库版本脚本,说明就是change thing parent to code。
Flyway可配置项
默认情况下建议遵循Flyway的默认约定,就可以很流畅地使用flyway进行数据库版本控制了。如果确实需要做一些调整,Flyway的约定项都是可以配置的,参照以下:
spring:
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
Flyway使用配置
Spring Boot方式
- POM
pom里引入依赖<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
- 建立文件夹
在resources文件夹下新建文件夹db/migrate - 编写SQL脚本
Flyway使用说明的更多相关文章
- Flyway客户端使用
一.flyway介绍 Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式.Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要 ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- 生产环境中,数据库升级维护的最佳解决方案flyway
官网:https://flywaydb.org/ 转载:http://casheen.iteye.com/blog/1749916 1. 引言 想到要管理数据库的版本,是在实际产品中遇到问题后想到的 ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- Oracle 中 union 和union all 的简单使用说明
1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...
- Map工具系列-02-数据迁移工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- Map工具系列-03-代码生成BySQl工具使用说明
所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...
- jQuery验证控件jquery.validate.js使用说明
官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery plugin: Validation 使用说明 转载 ...
随机推荐
- 相机自动对焦AF原理
相机自动对焦AF原理 AF性能是判断相机好坏的重要指标,主要从准确度和速度两个方面来进行考察,本文将介绍自动对焦的几种方式. 一.凸透镜成像原理 二.三种对焦方法 有公式在手,只要给相机安个测距仪就好 ...
- Python_Selenium之basepage 识别元素、浏览器操作、获取属性、鼠标事件、键盘事件、弹窗、切换frame、切换句柄等封装
#coding=gbkimport osimport timefrom selenium import webdriverfrom selenium.webdriver.common.by impor ...
- Python_Selenium之浏览器封装_去掉浏览器受到自动化控制横条显示及去掉是否记住密码弹窗
封装如下: from selenium import webdriverfrom common.config_utils import configfrom selenium.webdriver.ch ...
- system表空间
system : 1.空间,管理:字典所在,不放用户数据;一般单个数据文件即可. 如果system表空间不够大,即可设置自动扩展,或者bigfile 2.system 备份 必须归档下 才能open下 ...
- 解决java socket在传输汉字时出现截断导致乱码的问题
解决java socket在传输汉字时出现截断导致乱码的问题 当使用socket进行TCP数据传输时,传输的字符串会编码成字节数组,当采用utf8编码时,数字与字母长度为1个字节,而汉字一般为3个字节 ...
- Jetpack Compose和View的互操作性
Jetpack Compose Interoperability Compose风这么大, 对于已有项目使用新技术, 难免会担心兼容性. 对于Compose来说, 至少和View的结合是无缝的. (目 ...
- 注解式项目开发!详细解析Java中各个注解的作用和使用方式
@Target 作用: 指明了修饰的这个注解的使用范围, 即被描述的注解可以用在哪里 @Target(ElementType.Type) ElementType取值的类型: TYPE: 类,接口或者枚 ...
- iOS-block本质是什么?
一: block的原理是怎样的?本质是什么? block本质上也是一个OC对象,因为它的内部也有个isa指针 block是封装了函数调用以及函数调用环境的OC对象 接下来我们将通过底层源码来论证上诉两 ...
- 为Centos系统打补丁
4.1.操作系统打补丁: 1.centos更新说明: centos 官方没有发布关于centos操作系统的补丁. centos 操作系统更新可以参考如下建议. 2.更新操作系统软件包,操作系统版本.内 ...
- hud 3308 LCIS 线段树 区间合并
题意: Q a b 查询[a, b]区间的最长连续递增子序列的长度 U a b 将下表为a的元素更新为b 区间合并一般都有3个数组:区间最值,左区间最值和右区间最值 具体详见代码 #include & ...