Flyway——配置和使用(入门)

article/2025/11/10 10:13:23

文章目录

  • 介绍
  • 测试环境
  • 依赖引入
  • 配置数据库连接
  • 启动类
  • 设置脚本
  • 项目结构概览
  • 项目启动,观察日志和数据库结果
  • 测试R开头的脚本
    • 直接重启项目
    • 修改 R__add_user_info.sql 后重启
  • 变更数据库字段
  • 验证 V 只能执行一次的问题
  • 验证 R 可执行多次
  • 验证只有一个_会报错
  • 技能扩充
  • 参考资料
  • 代码下载

介绍

Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话来讲,Flyway 可以实现开发者 Git 管理不同人的代码那样,管理不同人的SQL脚本,从而做到数据库同步。

测试环境

  • Springboot 2.X
  • 数据库:MySQL
  • flyway:5.2.4

依赖引入

按照上面测试的要求,需要对MySQL数据库进行测试,所以需要使用下列依赖信息:

  • springboot主依赖版本:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version><relativePath /> <!-- lookup parent from repository -->
</parent>
  • 数据库连接、flyway依赖:
<dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>5.2.4</version></dependency></dependencies>

【额外注意:】必须增加数据库连接pom依赖!

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

否则会出现项目启动成功,但不会自动生成表的问题!

配置数据库连接

本次采取Springboot,只需要在application.yml中配置对应的数据库连接即可。

server:port: 80
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://106.55.137.66:3306/flyway?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8driver-class-name: com.mysql.cj.jdbc.Driver # mysql8的驱动,注意时区,如果是使用 MySQL 8 之前的驱动,可以是 com.mysql.jdbc.Driverflyway:locations: classpath:db/migration # 默认配置enabled: true # 默认baseline-on-migrate: trueclean-on-validation-error: false

启动类

启动类,只需要保证是Springboot应用即可:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class StartApplication {public static void main(String[] args) {try {SpringApplication.run(StartApplication.class,args);}catch (Exception e){System.out.println(e);}}
}

设置脚本

首先需要在classpath目录下,创建一个名为db.migration的文件夹。

然后向该文件夹内,增加SQL脚本。编写SQL脚本需要注意以下几点:

  • 1、仅需要执行一次的脚本,以V开头,后面跟上0~9的数字组合,数字之间可以使用.或者_进行分割。然后再以两个下划线 __进行分割,其后跟上文件名称,最后以.sql结尾。

    如: V1__create_user_ddl.sqlV2__create_user.sql

  • 2、需要重复执行的SQL,则需要以R开头。后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。

    如:R__truncate_user_dml.sql

编写如下所示的测试脚本V1__create_user.sql信息,如下所示:

CREATE TABLE IF NOT EXISTS `USER`(`USER_ID`          INT(11)           NOT NULL AUTO_INCREMENT,`USER_NAME`        VARCHAR(100)      NOT NULL COMMENT '用户姓名',`AGE`              INT(3)            NOT NULL COMMENT '年龄',`CREATED_TIME`     datetime          NOT NULL DEFAULT CURRENT_TIMESTAMP,`CREATED_BY`       varchar(100)      NOT NULL DEFAULT 'UNKNOWN',`UPDATED_TIME`     datetime          NOT NULL DEFAULT CURRENT_TIMESTAMP,`UPDATED_BY`       varchar(100)      NOT NULL DEFAULT 'UNKNOWN',PRIMARY KEY (`USER_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目结构概览

最初创建好数据库名后,此时数据库中的信息如下所示:
在这里插入图片描述
项目结构如下所示:
在这里插入图片描述

项目启动,观察日志和数据库结果

在这里插入图片描述
观察对应数据库结构信息,刷新数据库:
在这里插入图片描述
会出现两个表信息!
【疑问】为什么会出现两张表?

flyway_schema_history是一个flyway管理各个版本关系的表,主要用于维护和管理开发者本地的脚本版本信息。
在这里插入图片描述

另一张表,则是刚刚的SQL脚本执行结果表,如下所示:
在这里插入图片描述

测试R开头的脚本

classpath文件夹中,新增一个R__add_user_info.sql的脚本信息,其中SQL脚本如下所示:

insert into `user`(user_name,age) values('unknown',33);

重启项目,观察结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【注意】这里的 R 重复执行脚本,并不是说是启动项目后不断执行!

而是,每次启动项目,都会重新校验对应的 R__add_user_info.sql 内容是否变更,如果变更则重新执行

直接重启项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改 R__add_user_info.sql 后重启

修改R__add_user_info.sql中的信息,重新启动项目:

-- insert into `user`(user_name,age) values('unknown',33);insert into `user`(user_name,age) values('xiangjiao',22);

重启项目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

变更数据库字段

正常开发中,字段信息的变更,往往不是很常见,这个要看需求。

如果因为需求的出现,导致需要在数据库表中增加或修改字段信息,此时flyway能轻松胜任。

之前的SQL脚本中,只设定有用户名、性别等信息,但如果想增加一个密码字段,此时则需要新增一个脚本。

V2__add_user_pwd.sql,其中脚本内容如下所示:

ALTER TABLE `user` add column user_pwd varchar(11) default null comment '密码' after `age`;

user表中增加字段user_pwd,设定类型为varchar(11),默认为null
并要求在 age 字段 之后

在这里插入图片描述
重启项目,查看结果信息:
在这里插入图片描述
在这里插入图片描述
【批注:】这里居然插入到了最后 !!!

验证 V 只能执行一次的问题

之前说到,如果是需要可重复执行,需要使用R开头,编写SQL脚本。

但是如果在已运行成功的项目中,修改V开头的脚本,再重新启动脚本会咋样?

原脚本信息为:
在这里插入图片描述
接下来向其中再加一个字段,注意这里是V开头的脚本!
在这里插入图片描述

ALTER TABLE `user` add column user_position varchar(11) default null comment '位置';

重启项目,观察现象:
在这里插入图片描述
从控制台日志信息可以看出:

V开头的脚本文件,在项目启动时,会去flyway_schema_history表中匹配判断!
如果文本信息不匹配,则直接报错!!!!

验证 R 可执行多次

将之前修改的V文件还原,这次修改R文件。

原文件信息为:
在这里插入图片描述
在其中新增一条数据信息:
在这里插入图片描述
重启项目,观察结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
R文件变更后,启动并不会报错!

1、启动后,会判断R文件的内容信息是否发生变更。
2、如果未变更,则不会新增数据!
3、如果存在变更,则会将脚本再执行一遍

验证只有一个_会报错

当增加脚本文件,但命名为V3_add_user_pwd.sql

注意:当前V后只有一个_

在这里插入图片描述

insert into `user`(user_name,age) values('xiangjiao222',333);

当应用启动,则会出现如下所示的报错信息:
在这里插入图片描述

技能扩充

flyway的其他配置项:

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

参考资料

Flyway快速上手教程
mysql在表的某一位置增加一列、删除一列、修改列名

代码下载

gitee 仓库项目地址


http://chatgpt.dhexx.cn/article/OURXlEba.shtml

相关文章

flyway的快速入门教程

目录 一、简单介绍 二、为什么要使用flyway 三、flyway是如何工作的 四、如何使用flyway 1、先要初始化一个SpringBoot项目&#xff0c;引入依赖 2、在application.yml中添加相关配置 3、根据配置文件中填写的脚本存放路径&#xff0c;创建文件夹 4、添加需要运行的sql…

Flyway详解(使用说明及避坑指南、一文搞懂flyway)

一、简介 1.1 Flyway是什么&#xff1f; Flyway是一款开源的数据库版本管理工具&#xff0c;可以实现管理并跟踪数据库变更&#xff0c;支持数据库版本自动升级&#xff0c;而且不需要复杂的配置&#xff0c;能够帮助团队更加方便、合理的管理数据库变更。 例&#xff1a;创建…

MySQL数据库的集群解决方案(一)

读写分库架构 我们一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是说采用数据库集群的方案&#xff1a; 其中一个是主库&#xff0c;负责写入数据&#xff0c;我们称之为&#xff1a;写库&#xff1b; 其它都是…

MySQL数据库集群实战(1)——MySQL数据库基础知识

文章目录 一、为什么使用数据库&#xff1f;二、数据库概念数据库&#xff08;DataBase&#xff0c;DB&#xff09;数据库管理系统&#xff08;DataBase Management System&#xff0c;DBMS&#xff09;SQL概述 三、数据库存储文件的特点四、MySQL常见的数据对象五、MySQL数据类…

mysql-集群概述

mysql-主从模式 mysql-集群概述 可用性设计 站点高可用&#xff0c;冗余站点服务高可用&#xff0c;冗余服务 数据高可用&#xff0c;冗余数据 保证高可用的方法是冗余。但是数据冗余带来的问题是数据一致性问题 实现高可用的方案有以下几种架构模式&#xff1a; 主从模式 简…

MySQL数据库集群的原理与搭建

【1.应用背景】 在最近做的项目中&#xff0c;因为有一个短时间内很多人访问服务&#xff0c;会频繁访问数据库&#xff0c;看到这里不免有些人会想起数据库集群。我们组长也想到了用数据库集群&#xff0c;于是就带着我们几个研究起来了mysql数据库集群的搭建。因为我们几个的…

MySQL 数据库主从集群搭建

文章目录 1 准备工作2 配置主数据库3 配置从库4 从库设置只读用户5 推荐参考资料 1 准备工作 1 选择一个服务器当做主服务器&#xff0c;将服务器上需要的数据进行备份 2 安装从库的 MySQL&#xff0c;需要与主服务器的版本保持一致 3 将主服务器上的数据同步到从库中(主从集…

MySQL数据库主从集群架构搭建

一、相关概念 二、配置一主一从 三、配置一主多从 四、配置主从从 五、配置主主结构 六、配置半同步复制模式 一、相关概念 1.1 主从同步介绍&#xff1a; 存储数据的服务结构&#xff0c;分为2种角色&#xff1a; 主服务器(master)&#xff1a;接受客户端访问连接 从服务器(sl…

谈谈mysql数据库集群

现在&#xff0c;随着上网人数的激增&#xff0c;一些大型的网站开始使用数据库集群来提高数据库的可靠性和数据库的性能。那么在介绍数据库集群之前首先需要弄清楚几个问题。 1.为什么要用数据库集群 &#xff08;1&#xff09;通过使用数据库集群可以使读写分离&#xff0c;提…

MySQL集群配置

1. MySQL集群简介 MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎&#xff0c;允许在1个 Cluster 中运行多个MySQL服务器。MySQL Cluster 是一种技术&#xff0c;该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。…

MySQL数据库集群(双主双从)

文章目录 MySQL数据库集群(双主双从)实验环境双主双从双主双从进行测试 MySQL数据库集群(双主双从) 实验环境 保证每台centos7服务器配置静态的IP&#xff0c;初始化服务器&#xff0c;关闭防火前和selinux,保证四台服务器之间可以互相通信&#xff0c;并且做好hosts域名解析…

数据库与集群

数据库与集群 1、数据库集群 概念&#xff1a;数据库集群&#xff0c;顾名思义&#xff0c;就是利用至少两台或者多台数据库服务器&#xff0c;构成一个虚拟单一数据库逻辑映像&#xff0c;像单数据库系统那样&#xff0c;向客户端提供透明的数据服务。 数据库集群两个关键定…

数据库-mysql集群方案总结

一 概念解读 1 数据库高可用 高可用指的是&#xff1a;如果数据库发生了宕机或者意外中断等故障&#xff0c;能尽快恢复数据库的 可用性&#xff0c;保证业务不会因为数据库的故障而中断。 另外&#xff0c;数据库高可用还要数据一致性&#xff0c;如下: (1) 用作备份、只读副…

数据库集群

目录 主从复制集群单机数据库的问题单机到集群主从复制传统主从复制异步复制半同步复制 组复制&#xff08;MGR MySQL Group Replication MGR &#xff09; 主从复制演示准备两个MySQL服务实例修改主数据库MySQL_A的my.ini中的[mysqld]配置项下的配置如下修改从数据库MySQL_B的…

MySQL数据库的集群方案

1.简介 我们一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是说采用数据库集群的方案&#xff1a; 其中一个是主库&#xff0c;负责写入数据&#xff0c;我们称之为&#xff1a;写库&#xff1b; 其它都是从库&…

MySQL集群解决方案(1):MySQL数据库的集群方案

1、系统架构存在的问题 在我们的系统架构中&#xff0c;DBserver方面我们只是使用了单节点服务&#xff0c;如果面对大并发&#xff0c;海量数据的存储&#xff0c;显然单节点的系统架构将存在很严重的问题&#xff0c;所以接下来&#xff0c;我们将实现MySQL的集群&#xff0c…

C语言回调函数详解及实例

C语言回调函数详解及实例 回调函数&#xff1a;函数 F1 调用函数 F2 的时候&#xff0c;函数 F1 通过参数给函数 F2 传递了另外一个函数 F3 的指针&#xff0c;在函数 F2 执行的过程中&#xff0c;函数F2 调用了函数 F3&#xff0c;这个动作就叫做回调&#xff08;Callback&…

回调函数

什么是回调函数? 有以下三点 1、自己创建的函数&#xff1b; 2、没有调用&#xff1b; 3、但是函数执行了&#xff08;在某个条件下&#xff09;。 例如&#xff1a; 1.定时器函数 var a 1setItercal( function(){aconsole.log(a)},1000)//延时器var a 1setTimeout( functi…

C++中回调函数的一个简单例子?

回调函数应用实例&#xff1a; 1、定义一个Person类 &#xff08;Person.h&#xff09;文件&#xff1a; 注意&#xff1a;在这个类中指定了回调函数&#xff0c;回调函数的执行者&#xff0c;和回调函数指针 重要的是 回调函数和回调函数指针是怎么关联的&#xff1f; 2、…

一个简单的jQuery回调函数例子

欢迎扫码加入Java高知群交流 jQuery回调函数简单使用 比如说&#xff0c;我们想要点击某个按钮后触发事件&#xff0c; 先把一些指定内容给隐藏掉&#xff0c; 然后跳出相关信息的对话框。 如果使用普通的方法&#xff0c; 不用回调函数的话&#xff0c; 会有怎么样的效…