Flyway 搭建

article/2024/12/26 8:33:38

一、总体搭建介绍

1.1、Flyway简介

Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。项目启动时,Flyway会自动运行,如果数据库中没有版本表,flyway会自动创建一个版本表,用于记录sql执行记录。flyway会根据配置的sql文件路径扫描路径下(默认是 classpath:db/migration )的所有sql脚本,与版本表脚本记录进行比对,执行新增加脚本。

官网地址:https://flywaydb.org/documentation/

1.2、选型原因

在实际的项目开发实施过程中,很少能一次性把所有表结构好,或多或少的都会有调整。使用Flyway,能很方便的管理迭代的数据库结构以及初始化数据,并且部署到每个环境都是一致的。

在实际项目中个人已知问题:
问题1、开发过程中会有数据库结构的新增、调整或者数据的初始化操作,总是忘记在各个环境执行。
问题2、每次发版,都需要先停服务,再执行sql文件,然后才能启动服务。
问题3、团队中其他开发人员如果使用到本地库,则每次都需要看看是否有最新的sql,然后手动执行。

Flayway就是为了解决上述问题,提高开发效率。

二、搭建步骤

2.1、application.yml配置

事前准备:数据库配置已经,且项目可正确启动。

# Spring配置
spring:flyway:# flyway 自动配置开启enabled: true# 版本控制表table: sys_schema_history# 禁止清理数据库表clean-disabled: true# 如果数据库不是空表,需要设置为true,否则启动报错baseline-on-migrate: true# 是否检验validate-on-migrate: false# sql脚本目录 -- 如果是默认目录(resources/db/migration),不需要指定
#    locations:
#      - classpath:db/migration

全部配置清单

//对执行迁移时基准版本的描述.
baseline-description
//当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
baseline-on-migrate
//开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
baseline-version
//检查迁移脚本的位置是否存在,默认false.
check-location
//当发现校验错误时是否自动调用clean,默认false.
clean-on-validation-error
//是否开启flywary,默认true.
enabled
//设置迁移时的编码,默认UTF-8.
encoding
//当读取元数据表时是否忽略错误的迁移,默认false.
ignore-failed-future-migration
//当初始化好连接时要执行的SQL.
init-sqls
//迁移脚本的位置,默认db/migration.
locations
//是否允许无序的迁移,默认false.
out-of-order
//目标数据库的密码.
password
//设置每个placeholder的前缀,默认${.
placeholder-prefix
//是否要被替换,默认true.
placeholder-replacementplaceholders
//设置每个placeholder的后缀,默认}.
placeholder-suffix
//设置placeholder的value
placeholders.[placeholder name]
//设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
schemas
//迁移文件的前缀,默认为V.
sql-migration-prefix
//迁移脚本的文件名分隔符,默认__
sql-migration-separator
//迁移脚本的后缀,默认为.sql
sql-migration-suffix
//使用的元数据表名,默认为schema_version
tableflyway
//迁移时使用的目标版本,默认为latest version
target
//迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
url
//迁移数据库的用户名
user
//迁移时是否校验,默认为true
validate-on-migrate

2.2、pom.xml

pom.xml文件中增加如下配置

<!-- flyway-->
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency>

2.3、sql文件

2.3.1、sql文件命名规则

以大写的"V"开头,V+版本号(版本号的数字间以”.“或”_“分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名。
例如: V20220723__alter_table.sql、V1.0.1__create_table.sql、V4.1_2__add_table.sql 。

注意:版本号不能重复;版本号不能重复;版本号不能重复;

2.3.2、sql文件位置

默认位置:resources/db/migration 下,如果不是默认位置,需要在application.yml中指定自定义位置。
特别提示:创建文件夹时,必须一层一层创建,不可db.migration,正确图示如下
在这里插入图片描述

三、过程中可能会遇到的问题解决办法

3.1、@PostConstruct

如果项目中用到了@PostConstruct,则需要替换为@DependsOn(“flywayInitializer”)。
原因:@PostConstruct会先于flyway执行,如果数据库表结构还未初始化,启动会报错。

3.2、spring.flyway.locations[0].classpath

出现如下错误信息

Binding to target [Bindable@9ead57 type = java.util.List<java.lang.String>, value = 'provided', annotations = array<Annotation>[[empty]]] failed:Property: spring.flyway.locations[0].classpathValue: db/migrationOrigin: class path resource [application.yml] - 97:20Reason: The elements [spring.flyway.locations[0].classpath] were left unbound.

出现问题原因:classpath的冒号后面不要带空格。

    # sql脚本目录 -- 如果是默认目录(resources/db/migration),不需要指定locations:- classpath:db/migration

http://chatgpt.dhexx.cn/article/83ZP1okE.shtml

相关文章

Spring boot集成flyway

一、引入依赖&#xff08;以Maven项目为例&#xff09; spring boot项目首先引入数据库连接驱动依赖 <!-- jdbc 连接依赖&#xff0c;如果使用了mybatis或mybatis-plus&#xff0c;可直接引入对应mybatis依赖 --> <dependency><groupId>com.baomidou</gr…

开发flyray的初衷

开发flyray的初衷 一是为了自我学习&#xff0c;二是为了方便项目开发flyray项目介绍 使用SpringSpringMVCMybatisdubbox 开发的一套分布式基础框架&#xff0c;提供支付、对账、清结算、客户管理、营销活动、库存管理、搜索模块、rocketmq做统一的消息队列中心 使用技术 后…

flyway

需求&#xff1a; 目前环境太多套&#xff0c;而且每套的代码版本都是不一致的&#xff0c;再分支升级版本的时候每次都需要处理数据库的sql脚本&#xff0c;用人工核对容易出错或遗漏&#xff0c;为避免sql脚本混乱&#xff0c;需要统一的数据版本工具来进行维护。当前公司生…

springboot:集成flyway

文章目录 springboot&#xff1a;集成flyway一、简介二、Flyway工作流程三、配置文件使用Flyway添加相关配置创建脚本所在文件夹sql脚本命名规范启动测试 四、Flyway配置清单五、maven插件的使用migratebaselineclean&#xff08;慎用&#xff09;inforepairvalidateundo 六、f…

Firefly

Firefly(流萤): 中文对话式大语言模型在本文中&#xff0c;笔者将介绍关于Firefly&#xff08;流萤&#xff09;模型的工作&#xff0c;一个中文对话式大语言模型。https://mp.weixin.qq.com/s/TX7wj8IzD_EaMTvk0bjRtA一个支持中文的176B开源基础模型BLOOM&#xff1a;从数据源…

RIP 水平分割

水平分割 为了防止环路,RIP引入了水平分割机制,即从一个接口收到的路由更新,不会再从这个接口发出去,水平分割默认开启. 实验&#xff1a;RIP的水平分割 首先我们先查看R1和R3的路由表有什么异常

RIP水平分割实验

华为RIP水平分割实验 为了防止环路&#xff0c;BIP引入了水平分割机制&#xff0c;即从一个接口收到得路由更新&#xff0c;不会在从这个接口发出去&#xff0c;水平分割默认开启 实验拓补图如下 首先配置R1 system view [Huawei]sysname R1 [R1]int g0/0/0 [R1-Gigabi…

路由协议BGP之打破IBGP水平分割✍

为什么需要打破IBGP的水平分割&#xff1f; 因为IBGP水平分割&#xff0c;导致在一个AS内部若一台BGP路由器需要将通过其他AS学习到的路由传递给本地AS中的ibgp邻居时&#xff0c;需要和本地AS内部所有的BGP设备建立IBGP邻居关系&#xff1b;邻居关系数量成指数上升&#xff1…

解决IBGP的水平分割和BGP选路原则

解决IBGP的水平分割问题 IBGP水平分割&#xff1a;防止环路的产生 方法1&#xff1a;路由反射器(RR) 路由反射器可以反射所学习到的IBGP路由信息。 指定一台路由器称为 路由反射器&#xff08;RR&#xff09; 的时&#xff0c;必须在他的IBGP对等体关系中选择一个或者多个设备…

html中怎么接着水平线后面,html水平分割线怎么设置?html水平分割线的代码示例讲解...

在前端网页的开发中我们有时候需要用到水平分割线来分割不同的文档&#xff0c;会让整个网页看起来美观和整洁&#xff0c;也会凸显某一段文字的重要性&#xff0c;那么网页中水平分割线该如何实现呢&#xff1f; 本篇文章就给大家来分享一下html水平分割线的实现方法。 在html…

基于WPS的Word最佳实践系列(给标题添加水平分割线)

基于WPS的Word最佳实践系列&#xff08;给标题添加水平分割线&#xff09; 项目背景 在日常办公中&#xff0c;我们经常需要给标题添加一条水平分割线&#xff0c;将标题与正文内容分开&#xff0c;那么如何快速添加水平分割线呢&#xff1f; 项目实施 1. 添加水平分割线 …

5.2 BGP水平分割

5.2.2实验2&#xff1a;BGP水平分割 1. 实验目的 熟悉BGP水平分割的应用场景掌握BGP水平分割的配置方法 2. 实验拓扑 实验拓扑如图5-2所示&#xff1a; 图5-2&#xff1a;BGP水平分割 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 R1的配置 <Huawei&g…

图像分割之水平集(Level Set)分割

几何活动轮廓模型——水平集分割&#xff1a;Active Contours Without Edges 水平集方法 水平集是跟踪轮廓和表面运动的一种数字化方法&#xff0c;它不直接对轮廓进行操作&#xff0c;而是将轮廓设置成一个高维函数的零水平集。这个高维函数叫做水平集函数。然后对该水平集函数…

BGP选路——本地优先级选路(+BGP路由水平分割机制)

目录 一、本地优先级特性 二、配置命令&#xff1a; 三、图解&#xff1a; 四、BGP路由水平分割机制 BGP路由13条选路顺序&#xff1a; 权重——本地优先级——本地始发——最短AS-PATH——起源属性——MED属性——EBGP路由优于IBGP——八——九——十——十一——十二——…

html文字段落分割,HTML设置水平分割线_html/css_WEB-ITnose

在Web中使用水平分割线可以分割不同的文字段落或者其它网页组件&#xff0c;轻松地修饰了段落排版&#xff0c;使之更美观。当然&#xff0c;水平分割线还可以更加明显地突出某一段重要的文字&#xff0c;使之更加醒目。 使用标签可以轻松地设置一条水平线。方法如下&#xff1…

初步了解BGP-2【update-source、水平分割、同步概念】

初步了解BGP-2【update-source、水平分割、同步概念】 目录 初步了解BGP-2【update-source、水平分割、同步概念】Update-sourceIBGP 水平分割IBGP与IGP的同步 Update-source 由于BGP无法像IGP那样自动发现邻居&#xff0c;而BGP的邻居需要手动指定邻居&#xff0c;一般情况下…

html分割线颜色怎么在css中写,html水平分割线 html 分割线颜色怎么变浅

深入理解es6和es6标准入门哪本好 Dubbo的分布式系统架构实战需要哪些步骤完成 HTML如何添加水平分割线: HTML提供了修饰段落的水平分割线&#xff0c;在很多的网页布局中都可以轻松使用&#xff0c;而不需要另外作图。水平分割线的标签是单标签&#xff1a; 默认情况下只占一行…

水平集分割

基于距离正则的水平集分割MATLAB代码&#xff0c;无需初始化 % This Matlab code demonstrates an edge-based active contour model as an application of % the Distance Regularized Level Set Evolution (DRLSE) formulation in the following paper: % % C. Li, C. X…

图像分割 - 水平集算法

水平集介绍 水平集分为三种&#xff1a; 1 . 基于图像边缘灰度梯度信息 &#xff0c;适用于边缘强的图像分割 2 . 基于区域特征 &#xff0c;利用区域信息引导曲线慢慢靠近 &#xff0c;比如分割曲线区域的内外灰度均值&#xff0c;分割曲线内部区域面积&#xff08;例如 Ch…

IBGP水平分割

IBGP水平分割规则 IBGP水平分割用于在IBGP对等体之间进行路由传递时&#xff0c;无法像EBGP对等体那样一来AS-Path属性进行防止环路的问题&#xff0c;因为AS-Path属性在AS内进行传递时是不会发生改变的。 下图便是极有可能出现IBGP对等体环路的场景&#xff1a; R1将10.1.1.…