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

news2025/7/11 1:37:36

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

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

还是直接上代码
第一步:

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

第二步:配置文件

spring:
  flyway:
    # 是否启用flyway
    enabled: true
    # 禁止清理数据库表
    # clean 操作是 Flyway 的一个功能,可以清空数据库中的所有对象(比如表、视图、存储过程等),
    #以便进行全新的数据库迁移。在开发和测试阶段,这可能是有用的,因为它可以确保每次都从一个干净的数据库状态开始运行。
    #但在生产环境中,执行 clean 操作可能会导致数据丢失,因此通常需要禁用它
    clean-disabled: true
    # 如果数据库不是空表,需要设置成 true,当迁移数据库存在但没有元数据的表时,自动执行基准迁移
    #当数据库中不存在迁移历史记录表时,Flyway 会自动创建该表,并将当前已经存在的数据库对象标记为已迁移状态。
    #当数据库中存在迁移历史记录表,但版本号低于最新的迁移脚本版本时,
    #Flyway 也会自动创建一个基线版本,从而将现有的数据库对象标记为已迁移状态,并开始应用最新的迁移脚本。
    #这样做的目的是确保在已有数据库上使用 Flyway 进行迁移时,无论数据库是否已经有迁移历史记录,
    #都能够正确地进行迁移操作。这在初始化应用程序时特别有用,因为它允许你在部署应用程序到新环境时,
    # 自动初始化数据库并应用最新的迁移脚本。
    baseline-on-migrate: true
    # 开始执行基准迁移时对现有的schema的版本打标签,默认值为1
    #baseline-version: 1
    # 编码格式,默认UTF-8
    encoding: 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
    # 迁移时是否进行校验,默认true
    validate-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 Transfer
 Date: 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插件或命令行工具生成相应的数据库迁移脚本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1593367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FJSP:鲸鱼优化算法WOA求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

【Kafka】Kafka 架构深入

Kafka 工作流程及文件存储机制 Kafka 中消息是以 topic 进行分类的&#xff0c;生产者生产消息&#xff0c;消费者消费消息&#xff0c;都是面向 topic 的。 topic 是逻辑上的概念&#xff0c;而 partition 是物理上的概念&#xff0c;每个 partition 对应于一个 log 文件&am…

大模型(Large Models):探索人工智能领域的新边界

&#x1f31f;文章目录 &#x1f31f;大模型的定义与特点&#x1f31f;模型架构&#x1f31f;大模型的训练策略&#x1f31f;大模型的优化方法&#x1f31f;大模型的应用案例 随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;成为了引领深度…

CSS盒模型(详讲)

目录 概述&#xff1a; 内容区&#xff08;content&#xff09;&#xff1a; 内边距&#xff08;paddingj&#xff09;&#xff1a; 前言&#xff1a; 设置内边距&#xff1a; 边框&#xff08;border&#xff09;&#xff1a; 前言&#xff1a; 示例&#xff1a; 外边…

ACID模型是什么

ACID模型是什么 ACID模型是数据库管理系统中保证事务处理安全性的一组特性。ACID是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;四个英文单词的…

WebApi+Python PyQ5实现大文件下载,Ui增加进度条和下载速率+已验证uos和Windows环境

Web Api接品代码&#xff1a; using Microsoft.AspNetCore.Mvc; using System.Collections.Concurrent; using System.Net;namespace LargeFileHandling.Controllers {[ApiController][Route("[controller]")]public class TestProgramFileManagerController : Cont…

【鸿蒙开发】第二十章 Camera相机服务

1 简介 开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用&#xff0c;应用通过访问和操作相机硬件&#xff0c;实现基础操作&#xff0c;如预览、拍照和录像&#xff1b;还可以通过接口组合完成更多操作&#xff0c;如控制闪光灯和曝光时间、对焦或调焦等。 2 …

js canvas实现裁剪图片并下载

简历上给自己挖的坑&#xff0c;面试被拷打&#xff0c;早就该填了T.T 参考&#xff1a;【js canvas实现图片裁剪】 https://www.bilibili.com/video/BV1QK411d7n1/?share_sourcecopy_web&vd_sourcebf743b20b76eab11028ba2fb05f056b4 效果 思路 组成&#xff1a; 上传文…

8. Spring Boot 配置文件

源码地址&#xff1a;SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下 1. 配置文件是什么 上节说到&#xff0c;Spring Boot的项目分为三个部分&#xff1a;源代码目录、资源目录、单元测试目录。 而配置文件的位置就位于资源目录res…

【竞技宝jjb.lol】LOL:T1成功击败HLE晋级MSI!

北京时间2024年4月13日,英雄联盟LCK2024春季季后赛继续进行,昨天迎来败者组决赛HLE对阵T1。本场比赛HLE率先拿下一局之后,T1连续两局在后期决策上碾压HLE拿到赛点,第四局zeus祭出上单VN在中期杀穿HLE后排,最终T1以3-1的比分击败HLE晋级春季决赛,同时也拿到了MSI的参赛资格。以下…

CSS3 常用样式

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍CSS3 常用样式&#x1f48e;1 CSS3 新增选择器&#x1f339;1.1 属性选择器…

Python匿名函数4不要

当你需要完成一件小工作时&#xff0c;在本地环境中使用这个函数&#xff0c;可以让工作如此得心应手&#xff0c;它就是Lambda 函数。 Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas&#xff0c;它们的语法如下&#xff1a; lambda arguments: expressionl…

拥有了这24个Python接单平台,你就拥有了“钞能力”

学Python能兼职挣米吗&#xff1f;怎么挣&#xff1f; 一、Python兼职种类&#xff1a; 接私活刚学会python那会&#xff0c;就有认识的朋友介绍做一个网站的私活&#xff0c;当时接单赚了4K&#xff0c;后又自己接过开发网站后台接口、做数据处理等事情&#xff0c;都赚了一…

Python实现外观模式、桥接模式、组合模式和享元模式

今天介绍四种结构型设计模式&#xff1a;外观模式、桥接模式、组合模式和享元模式 外观模式 外观模式&#xff08;Facade Pattern&#xff09;&#xff0c;它为子系统提供一个统一的接口&#xff0c;使得子系统更加容易使用。 在Python中&#xff0c;我们可以通过定义一个外…

记录-若依前端集成markdown文档,自动生成文档目录

使用版本: vue 2.6.12 html-loader 1.3.2 markdown-loader 6.0.0 github-markdown-css ^5.5.1 highlight.js 9.18.5 webpack 4.47.x 一.引入loder插件&#xff0c;html-loader和markdown-loader //安装 pnpm install html-loader --save ; pnpm install markdown-loader --sa…

Zynq学习笔记--AXI 总线概述

目录 1. AXI总线概述 1.1 主要特点 1.2 通道功能 1.3 信号概览 2. AXI Interconnect 2.1 信号说明 2.2 内部结构 3. PS-PL AXI Interface 3.1 AXI FPD/LFP/ACP 3.2 Address Editor 3.3 地址空间 3.4 AXI-DDR 4. 通过ILA观察AXI信号 4.1 AXI 读通道 1. AXI总线概述…

头歌-机器学习 第15次实验 朴素贝叶斯分类器

第1关:条件概率 任务描述 本关任务:根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务,你需要掌握条件概率。 条件概率 朴素贝叶斯分类算法是基于贝叶斯定理与特征条件独立假设的分类方法,因此想要了解朴素贝叶斯分类算法背后的算法原理,就不得…

STM32-看门狗

1、看门狗是什么&#xff1a;就是一个向下定时器&#xff0c;定时时间一到&#xff0c;就会触发一个向下的复位的中断&#xff0c;使单片机开始工作 2、作用&#xff1a;MCU微控制器构成的微型计算机系统中&#xff0c;由于微控制器的工作常常会受到来自外界电磁场的干 扰,造成…

PostgreSQL入门到实战-第二十六弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(一)官网地址PostgreSQL概述PostgreSQL中GROUP BY命令理论PostgreSQL中GROUP BY命令实战更新计划 PostgreSQL中数据分组操作(一) 如何使用PostgreSQL GROUP BY子句将行分组。 官网地址 声明: 由于操作系统, 版本更新等原因, 文…

Transformer 结构浅析

Transformer 结构浅析 文章目录 Transformer 结构浅析Transformer 网络结构编码器位置编码多头注意力层Add&NormFeed Forward 解码器带掩码的多头注意力层多头注意力层 预测 Transformer 网络结构 Transformer模型的网络结构如图&#xff0c;且transformer结构主要分为两部…