SpringBoot整合Flyway管理数据库版本

今天的积累都是为了更好的明天,加油!我是java程序员可以关注我一起学习哈!

对于 SpringBoot 项目开发, 其实不需要专门安装 flyway 命令行工具和 maven 插件, SpringBoot 启动就会自动执行 DB migrate 操作. 对于其他的 flyway 操作, 就需要使用命令行工具或 maven 插件了.

flyway 提供命令行工具, 常用的命令包括:
Clean: 删除所有创建的数据库对象, 包括用户、表、视图等. 注意不要在生产库上执行 clean 操作. 
Migrate: 对数据库依次应用版本更改. 
Info: 获取目前数据库的状态. 那些迁移已经完成, 那些迁移待完成. 所有迁移的执行时间以及结果. 
Validate: 验证已 Apply 的脚本是否有变更, Flyway 的 Migration 默认先做 Validate. 
Baseline: 根据现有的数据库结构生成一个基准迁移脚本. 
Repair: 修复命令尽量不要使用, 修复场景有: 1. 移除失败的 migration 记录. 2.已经应用的 SQL 脚本被修改, 我们想重新应用该 SQL 脚本.

项目结构:

SpringBoot整合Flyway管理数据库版本_第1张图片

pom.xml添加依赖

 
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.3.0
        
        
            mysql
            mysql-connector-java
        
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            org.flywaydb
            flyway-core
            5.2.1
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

 maven插件


            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
                org.flywaydb
                flyway-maven-plugin
                5.2.1
            
        

application.properties配置

server.port=8081
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/flywaytest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
mybatis.type-aliases-package=com.example.domain
mybatis.mapper-locations=mapper/*.xml
# 指定flyway脚本位置
spring.flyway.locations=classpath:/db/migration
# 打开flyway执行日志
logging.level.org.flywaydb=info

测试sql

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;

 启动项目

数据库会多出以下这张表,来记录执行的操作!

sql已执行成功! 注意执行后的sql脚本不要进行修改,否则会报错!

可能遇到的问题: 

问题1:
Caused by: java.lang.NoClassDefFoundError: org/flywaydb/core/api/configuration/FluentConfiguration

修改flyway-core版本即可!


            org.flywaydb
            flyway-core
            5.2.1
       


问题2:        
V1__init_database.sql执行后,再次改动V1__init_database.sql,启动会报错!        
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 : 135091410
-> Resolved locally    : -724292036

Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration description mismatch for migration version 1

那么出现这个问题的原因是什么呢? 
这里涉及到flyway的一些基本常识,flyway 官方文档:https://flywaydb.org/documentation/ 
常识1):项目每次执行,都会调用数据库,会先运行SQL Script 要使用到Flyway,但是flyway查询数据时,会判断数据库的数据结构或者数据什么的是否改变,判断标准就是checksum。

问题3:
如果数据库存在表,并且sql脚本之前没有被执行过,启动程序会报错;

你可能感兴趣的:(java编程)