当前位置:网站首页>Quick Start Tutorial for flyway
Quick Start Tutorial for flyway
2022-07-30 10:11:00 【m0_54850467】
目录
4、添加需要运行的sql脚本.sql脚本的命名一定要规范,否则运行flyway会报错
一、简单介绍
Flyway是一款开源的数据库版本管理工具.它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本.
在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代.在Java应用程序中使用Flyway,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的.
flyway官方文档[这里是图片001]https://flywaydb.org/documentation/
二、为什么要使用flyway
在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题.
其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:
- 自己写的SQL忘了在所有环境执行.
- 别人写的SQL我们不能确定是否都在所有环境执行过了.
- 有人修改了已经执行过的SQL,期望再次执行.
- 需要新增环境做数据迁移.
- 每次发版需要手动控制先发DB版本,再发布应用版本.
- 其它场景.
有了flyway,这些问题都能得到很好的解决.
三、flyway是如何工作的
flyway工作流程如下:
- 项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行.
- 初次使用时,flyway会创建一个flyway_schema_history表,用于记录sql执行记录.
- Flyway会扫描项目指定路径下(默认是classpath:db/migration)的所有sql脚本,与flyway_schema_history表脚本记录进行比对.如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行.
- 如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本.再按照版本号从小到大,逐个执行其余脚本.
四、如何使用flyway
注:以下为本篇文章内容对应源码,可以自行下载测试,仅需要修改对应的数据库账号密码配置即可.如果对您有帮助,麻烦帮我点个赞或者star,你的鼓励,就是我更新的动力.
flyway使用示例代码[这里是图片002]https://github.com/wangming2674/flyway-use-demo
1、先要初始化一个SpringBoot项目,引入依赖
我使用的版本是2.3.5.RELEASE,引入mysql、mybatis、flyway等依赖,pom.xml文件内容如下:
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<mysql.version>8.0.25</mysql.version>
<mybatis-starter.version>2.2.1</mybatis-starter.version>
<flyway.version>6.1.0</flyway.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-starter.version}</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flyway.version}</version>
</dependency>
</dependencies>
2、在application.yml中添加相关配置
spring:
# 数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
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
3、根据配置文件中填写的脚本存放路径,创建文件夹
根据上面配置文件中的脚本存放路径,我们需要在resource目录下建立文件夹db/migration .
4、添加需要运行的sql脚本.sql脚本的命名一定要规范,否则运行flyway会报错
命名规则主要有两种:
- 仅需要被执行一次的SQL命名以大写的"V"开头,V+版本号(版本号的数字间以”.“或”_“分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名.例如:V20201100__create_user.sql、V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql.
- 可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾.(不推荐使用)比如:R__truncate_user_dml.sql.
其中,V开头的SQL执行优先级要比R开头的SQL优先级高.
创建完成后,目录应如下所示:
其中2.1.6、2.1.7和every的文件夹不会影响flyway对SQL的识别和运行,可以自行取名和分类.
5、启动项目, 通过flyway执行定义好的脚本
在控制台可以看到相关日志打印,并在数据库中查看到已经创建好的表和相关记录变更.
6、提示说明
如果我们修改V2__add_user.sql
中的内容,再次执行的话,就会报错,提示信息如下:
[ERROR] Migration checksum mismatchformigration version 2
如果我们修改了R__add_unknown_user.sql
,再次执行的话,该脚本就会再次得到执行,并且flyway的历史记录表中也会增加本次执行的记录.
五、maven插件的使用
1、配置插件
以上步骤中,每次想要migration都需要运行整个springboot项目,并且只能执行migrate一种命令,其实flyway还是有很多其它命令的.maven插件给了我们不需要启动项目就能执行flyway各种命令的机会.
在pom.xml中引入flyway的插件,同时配置好对应的数据库连接.
<build>
<plugins>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>5.2.4</version>
<configuration>
<url>jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
</url>
<user>root</user>
<password>root</password>
<driver>com.mysql.cj.jdbc.Driver</driver>
</configuration>
</plugin>
</plugins>
</build>
2、插件命令说明
此时,我们双击执行上图中的flyway:migrate的效果和启动整个工程执行migrate的效果是一样的.
其它命令的作用如下:
baseline
对已经存在数据库Schema结构的数据库一种解决方案.实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以在已有表结构的数据库中实现添加Metadata表.
clean
清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用,但在生产环境务必禁用.
info
用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本.
repair
repair操作能够修复metaData表,该操作在metadata出现错误时很有用.
undo
撤销操作,社区版不支持.
validate
验证已经apply的Migrations是否有变更,默认开启的,原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败.
六、flyway知识补充
- flyway执行migrate必须在空白的数据库上进行,否则报错.
- 对于已经有数据的数据库,必须先baseline,然后才能migrate.
- clean操作是删除数据库的所有内容,包括baseline之前的内容.
- 尽量不要修改已经执行过的SQL,即便是R开头的可反复执行的SQL,它们会不利于数据迁移.
- 当需要做数据迁移的时候,更换一个新的空白数据库,执行下migrate命令,所有的数据库更改都可以一步到位地迁移过去.
七、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
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在.深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小.自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前.因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担.添加下方名片,即可获取全套学习资料哦
边栏推荐
- CVTE校招笔试题+知识点总结
- JCL 学习
- shell脚本
- An article to understand service governance in distributed development
- hcip06 ospf特殊区域综合实验
- 梅科尔工作室-看鸿蒙设备开发实战笔记四——内核开发
- 北京突然宣布,元宇宙重大消息
- Soft Exam System Architect Concise Tutorial | Case Analysis | Requirement Analysis
- leetcode 剑指 Offer 52. 两个链表的第一个公共节点
- Multi-threading scheme to ensure that a single thread opens a transaction and takes effect
猜你喜欢
快解析结合泛微OA
【深度学习】(问题记录)<对一个变量求梯度得到什么>-线性回归-小批量随机梯度下降
Multi-threading scheme to ensure that a single thread opens a transaction and takes effect
水电表预付费系统
Version management of public Jar packages
A near-perfect Unity full-platform hot update solution
Redis Desktop Manager 2022.4.2 发布
聊聊 MySQL 事务二阶段提交
Re17:读论文 Challenges for Information Extraction from Dialogue in Criminal Law
(***重点***)Flink常见内存问题及调优指南(一)
随机推荐
Determine whether a tree is a complete binary tree - video explanation!!!
Re17:读论文 Challenges for Information Extraction from Dialogue in Criminal Law
论文阅读:SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers
Redis Desktop Manager 2022.4.2 发布
多线程保证单个线程开启事务并生效的方案
你真的懂Redis的5种基本数据结构吗?
Baidu promotion assistant encounters duplicate keywords, verification errors, how to delete redundant ones with one click
LeetCode二叉树系列——94.二叉树的中序遍历
MySQL Explain usage and parameter detailed explanation
flyway的快速入门教程
leetcode 剑指 Offer 52. 两个链表的第一个公共节点
GNOME 新功能:安全启动被禁用时警告用户
快解析结合友加畅捷通t1飞跃版
多线程--线程和线程池的用法
leetcode 剑指 Offer 12. 矩阵中的路径
【深度学习】(问题记录)<对一个变量求梯度得到什么>-线性回归-小批量随机梯度下降
Google Cloud Spanner的实践经验
(BUG记录)No module named PIL
The use of qsort function and its analog implementation
软考 系统架构设计师 简明教程 | 案例分析 | 需求分析