SpringBoot中使用Flyway以及错误记录
- 一、什么是Flyway?
- 二、SpringBoot中使用Flyway
- 1.引入依赖/jar包
- 2.创建Flyway存放路径
- 3.Flyway sql脚本命令规则
- 4.使用es
- 5.配置
- 三、Flyway流程简介
- 四、错误总结/注意要点
- 1.注意要点
- 2.错误总结
- Flyway出现:validate failed:detected failed migration to version
一、什么是Flyway?
官网地址:flyway官网 Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。
Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
通俗的讲,Flyway可以像Git管理不同的人的代码那样,管理不同人的sql脚本,坐到数据库同步的功能。
二、SpringBoot中使用Flyway
1.引入依赖/jar包
新建SpringBoot
项目;
在pom.xml文件中添加依赖;
注意:版本号默认,需要保持和spring-boot-starter-parent
父版本号一致,自定义过高版本会出现不兼容情况 。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2.创建Flyway存放路径
在resource
下创建db\migration
文件夹路径,(默认情况下是classth:db/migration,但你能够在配置中使用flyway.locations进行修改。)
3.Flyway sql脚本命令规则
在db\migration
文件夹下创建sql
文件;
对于Flyway的脚本V<VERSION>__<NAME>
.sql;
这里的VERSION
使用下划线进行命名的方式;NAME
:对当前脚本的描述,这里举例说明下:
V20220202__INSERT_STUDENT.sql:这就代表version=20220202,描述为向student
表中插入数据;
4.使用es
如果使用ES的情况下,可以在db
文件夹下创建文件夹es
,在该路径下建立应用系统的版本号,例如V1.0.0
;
温馨提醒:其一这里的V字母要大写;其二version后面的下划线是两个下划线。
migration 后的SQL 脚本不应该再被修改,不然启动程序的时候会报错。
5.配置
想要启动Flyway功能,需要在application.yml
中进行配置:
spring:
flyway:
# 数据库名称
schemas: test
# flyway自动配置 true 开启
enabled: true
#设定 SQL 脚本的目录,多个路径使用逗号分隔, 比如取值为 classpath:db/migration,filesystem:/sql-migrations
locations:
- classpath:db/migration
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 与 baseline-on-migrate: true 搭配使用
baseline-version: 0
encoding: UTF-8
# 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder .
out-of-order: false
# 禁止清理数据库表
clean-disabled: true
# 校验
validate-on-migrate: true
# 版本控制日志表,默认flyway_schema_history,不同系统建议修改改数据
table: flyway_schema_history
三、Flyway流程简介
- 首先配置好Flyway的基本信息后,运行项目,会在数据库表中默认新建一个数据表用于存储Flyway的运行信息,默认的数据库名字是
FLYWAY_SCHEMA_HISTORY
; - 紧接着Flyway将开始扫描文件系统或应用程序的类进行迁移。然后,Flyway的数据迁移将基于对用sql脚本的版本号进行排序,并按顺序进行应用;
可以看到执行数据库表之后checksum
字段中会存储一个数值,用于在之后运行过程中对比sql文件执行是否有变化。
四、错误总结/注意要点
1.注意要点
- 版本的V的字母要大写;
- version后面的下划线是两个下划线;
- migration 后的SQL 脚本不应该再被修改,不然启动程序的时候会报错。
2.错误总结
Flyway出现:validate failed:detected failed migration to version
SpringBoot中使用Flyway出现:
- 报错:
org.flywaydb.core.api.FlywayException: Validate failed: Detected failed migration to version 1.0.9 (update)
错误的原因可能是sql脚本和数据库中有冲突,需要检查sql脚本哪里错了。 - 解决方法:
检查数据库里有没有创建schema_version这个记录表,如果有的话检查更新到哪个版本sql了,可能是以前已经执行过的sql文件有了改动,尝试删除schema_version再重新运行项目;
或者说是里面的sql有没有语法错误,在数据库里执行一下试试。
也可以试着把flyway_schema_history表里的最后一行删掉,还有报错提示的数据语句也删掉;
如果错误,欢迎指出