目录:
1. SpringBoot集成Flyway
2. 添加SQL脚本
3. 数据库版本信息
4. 常见错误和解决方法
SpringBoot是使用最多的Java开发框架,特点是自动化配置依赖模块,提供的一系列starter脚手架便于使用,充分体现了“开箱即用”和“约定优于配置”原则。
Flyway是一个数据库版本化管理工具,通过SQL脚本实现DB Migration自动化升级,支持独立运行,也可以和构建工具或者Spring开发环境集成。本文分享SpringBoot集成Flyway的配置方法,以及项目中的使用示例。
代码下载:https://github.com/jextop/StarterApi/
项目和SQL文件:
├── pom.sh
├── src/main/resources
│ ├── application.yml
│ └── db/migration
│ ├── V1.0.0_init.sql
│ └── V1.0.1_user.sql
代码文件 | 功能要点 | |
SpringBoot集成Flyway | pom.xml | 引入Flyway依赖:flyway-core |
application.yml | 配置数据源,也可以指定独立的Flyway配置。 | |
resources\db\migration\ | SQL脚本,比如V1.0.0__init.sql,名称规则可配置。 | |
数据库版本信息 | 数据表:flyway_schema_history | Flyway记录Migration信息和状态,数据表名称可配置。 |
一,SpringBoot集成Flyway
1. 新建SpringBoot项目时,选中Flyway,将自动添加Flyway依赖。
2. 已有SpringBoot项目,可以在pom.xml中直接引用Flyway:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
3. 在application.yml中配置数据源以及Flyway:
spring:
flyway:
locations: ["classpath:db/migration"]
table: flyway_schema_history
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/starter?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC
username: root
password: root
二,添加SQL脚本:resources\db\migration\
脚本文件路径和命名规则都可以配置,注意版本号递增,默认为:V+版本号+双下划线+描述
三,数据库版本信息
l 启动程序时,Flyway自动检查并运行SQL脚本
l Flyway将版本信息和状态保存到数据表flyway_schema_history
四,实际开发过程中常见错误,分享解决方法和建议:
l migrate运行失败,提示sql脚本错误
解决:独立运行flyway命令repair修复数据库中的升级信息,纠正SQL错误后再次migrate
建议:运行migrate之前,首先确保SQL正确。
l migrate没有运行增加的SQL脚本
解决:SQL脚本命名遵守规则,比如V1.0.0__init.sql
l migrate运行失败,提示权限不够,“xxx command denied to user ‘xxx’”
解决:账号需要拥有对应sql脚本需要的权限,比如create table
l migrate运行失败,提示数据库不空,“Found non-empty schema(s)”
解决:按照提示独立运行flyway命令baseline初始化。
建议:清空数据库,初始化从空数据库开始。
l 提示找不到数据库,“unkown database ‘xxx’”
解决:需要先创建出来一个空数据库。
l Spring集成Flyway后,清空数据,启动失败
解决:确认validationQuery,是否select 1 from dual还是某个指定的数据表。空数据库时需使用dual
l Spring集成Flyway后,启动运行出错
解决:某些依赖数据库的bean,需要指定在Flyway完成migrate之后运行
l SQL脚本V1.0__xxx.sql没有被运行
解决:Flyway通过版本号码唯一区分脚本,如果最开始运行baseline,Flyway将自动创建版本1.0
建议:1,从空数据库开始初始化,不要运行baseline
建议:2,初始化SQL脚本版本号从V1.0.1开始,使用三位数字。
--------------------------------
如果您觉得这篇文章对您有帮助,请点个“赞”,博主感激不尽!
Jext技术社区专注领域:软件工程实践,JIRA研发管理,分布式系统架构,软件质量保障。