spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼

2024-04-11 09:04

本文主要是介绍spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

flyway 是一个敏捷工具,用于数据库的移植。采用 Java 开发,支持所有兼容 JDBC 的数据库。

主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据。

还是直接上代码
第一步:

     <!-- Flyway 数据库迁移 依赖 他会根据spring boot版本 默认下载兼容依赖 不需要写版本号  --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId></dependency>

第二步:配置文件

spring:flyway:# 是否启用flywayenabled: true# 禁止清理数据库表# clean 操作是 Flyway 的一个功能,可以清空数据库中的所有对象(比如表、视图、存储过程等),#以便进行全新的数据库迁移。在开发和测试阶段,这可能是有用的,因为它可以确保每次都从一个干净的数据库状态开始运行。#但在生产环境中,执行 clean 操作可能会导致数据丢失,因此通常需要禁用它clean-disabled: true# 如果数据库不是空表,需要设置成 true,当迁移数据库存在但没有元数据的表时,自动执行基准迁移#当数据库中不存在迁移历史记录表时,Flyway 会自动创建该表,并将当前已经存在的数据库对象标记为已迁移状态。#当数据库中存在迁移历史记录表,但版本号低于最新的迁移脚本版本时,#Flyway 也会自动创建一个基线版本,从而将现有的数据库对象标记为已迁移状态,并开始应用最新的迁移脚本。#这样做的目的是确保在已有数据库上使用 Flyway 进行迁移时,无论数据库是否已经有迁移历史记录,#都能够正确地进行迁移操作。这在初始化应用程序时特别有用,因为它允许你在部署应用程序到新环境时,# 自动初始化数据库并应用最新的迁移脚本。baseline-on-migrate: true# 开始执行基准迁移时对现有的schema的版本打标签,默认值为1#baseline-version: 1# 编码格式,默认UTF-8encoding: UTF-8# 迁移sql脚本文件存放路径,默认db/migration# 如果配置完这个路径,也手动创建了这个目录  启动服务 一直报错 这个目录找不到# 可在目录里创建一个 .keep的空文本文件,以确保该目录在应用程序启动期间被编译并可用,以避免错误。locations: classpath:db/migration# 迁移sql脚本文件名称的前缀,默认V 前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable, U 表示 Undo# FlywaySQL 文件分为 VersionedRepeatableUndo 三种:# Versioned 用于版本升级, 每个版本有唯一的版本号并只能执行一次.# Repeatable 可重复执行,Flyway检测到 Repeatable 类型的 SQL 脚本的 checksum 有变动,# Flyway 就会重新应用该脚本. 它并不用于版本更新, 这类的 migration 总是在 Versioned 执行之后才被执行。# Undo 用于撤销具有相同版本的版本化迁移带来的影响。但是该回滚过于粗暴,过于机械化,一般不推荐使用。#  一般建议使用 Versioned 模式来解决sql-migration-prefix: V# 迁移sql脚本文件名称的分隔符,默认2个下划线__sql-migration-separator: __# 迁移sql脚本文件名称的后缀sql-migration-suffixes: .sql# 迁移时是否进行校验,默认truevalidate-on-migrate: true  

第三步:问题
手动在资源目录下 创建 db/migration文件夹
发现启动项目 还会报错没有文件夹
运行的时候报错,找不到db/migration找不到文件。
IllegalStateException: Cannot find migrations location in: [classpath:db/migration]

解决方案:
对于旧版本的库,我们可能需要在resources/db/migration/ 中创建一个名为.keep的空文本文件,以确保该目录在应用程序启动期间被编译并可用,以避免错误。

idea集成插件
Flyway Migration Creation

在这里插入图片描述
第四步:使用插件:
右键 资源文件夹 db/migration
在这里插入图片描述
你不需要写
V版本号__ 前缀 只需要写描述 他会自动给你创建版本号
在这里插入图片描述
第五步:
sql脚本编写:

/*Navicat Premium Data TransferDate: 10/04/2024 15:10:25测试 数据迁移表文件名命名规则大写的V开头V版本号__表名_要执行什么_xxx_xxx.sql
====================================================================注意:如果从 Navicat 工具里导出的sql文件 文件默认会有 DROP TABLE IF EXISTS `test_cg`; 这句命令如果是初始化数据库 有没有这句话都没影响,为了防止【使用中数据表】出现被删除的意外 不建议sql脚本里存在【删除表】的命令如果从Navicat导出来来的数据表 建议手动 把这个命令【 DROP TABLE IF EXISTS `test_cg`;】 给删除掉
=====================================================================如果当前的sql脚本是执行整个库! 是通过Navicat导出的整个库1. 导出后 DROP TABLE IF EXISTS `test_cg`;【这个命令一一删除掉!】2. flyway_schema_history 这个表给删除掉 这个表 会在启动项目的时候 flyway插件 初始化出来比如 开发完成的库 需要部署上线 肯定开发库里已经有了  flyway_schema_history这个表但是 生成的数据库 是一个新的数据库 所以为了让sql脚本执行 需要把flyway_schema_history这个表删除掉在 部署 正式项目 会自动生产出 flyway_schema_history 这个表 然后flyway会一一执行 sql脚本=====================================================================已经有 flyway_schema_history 这个表的 数据库 【不要删除这个表 或者 删除表里的数据】因为这个表里记录了 已经执行过的sql脚本 防止重复执行的!
======================================================================项目集成了flyway数据库迁移插件 不管创建表 表里新增字段、修改字段、删除字段、初始化表里的基础数据都建议写成sql脚本 放在 db/migration文件夹下可以用 Navicat -> 设计表 ->设计后【不要点保存】->点【sql预览】-> 复制sql到项目的sql脚本里让项目执行sql脚本创建表结构如果 【点了保存】 表已经存在 在启动项目会报错【表存在】后续 有更简便方案 再优化
======================================================================注:sql脚本里 编写 删除命令 一定要慎重执行过的sql脚本 不要修改 连格式化或者空格都别做!!!如果改动了启动项目会报错 他好像会检测文件每次创建一个新文件使用
*/SET NAMES utf8mb4;
SET
FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for test_cg
-- ----------------------------
CREATE TABLE `test_cg`
(`id`          bigint UNSIGNED NOT NULL AUTO_INCREMENT,`user_id`     int NULL DEFAULT NULL COMMENT '登录用户ID',`username`    varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '登录用户名称',`remark`      varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注',`create_time` timestamp NULL DEFAULT NULL COMMENT '操作时间',`test_add`    varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '测试字段',`aaa`         varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '加个字段',PRIMARY KEY (`id`) USING BTREE,INDEX         `idx_username`(`username`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '代码生成测试表' ROW_FORMAT = DYNAMIC;SET
FOREIGN_KEY_CHECKS = 1;

项目启动后 他会自动执行 这里的sql

flyway弊端 : sql脚本 需要你手动编写 不能自动生成 很烦!

据说下面的这个依赖可以做到 根据数据库表自动生成脚本
因为项目已经集成了 flyway 懒得换
有兴趣的小伙伴可以尝试装 这个Liquibase 依赖

Liquibase:Liquibase是一个开源的数据库变更管理工具,它可以通过XML或YAML等配置文件来描述数据库变更,支持基于Java代码的迁移脚本生成。你可以定义实体类,并通过Liquibase Maven插件或命令行工具生成相应的数据库迁移脚本。

这篇关于spring boot 集成 flyway依赖 做数据库迁移,让部署没烦恼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893632

相关文章

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Java Predicate接口定义详解

《JavaPredicate接口定义详解》Predicate是Java中的一个函数式接口,它代表一个判断逻辑,接收一个输入参数,返回一个布尔值,:本文主要介绍JavaPredicate接口的定义... 目录Java Predicate接口Java lamda表达式 Predicate<T>、BiFuncti

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++