Flyway 数据库版本管理 | 专业解决方案

2024-06-15 19:44

本文主要是介绍Flyway 数据库版本管理 | 专业解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

目前很多公司都是通过人工去维护、同步数据库脚本,但经常会遇到疏忽而遗漏的情况,同时也是非常费力耗时

比如说我们在开发环境对某个表新增了一个字段,而提交测试时却忘了提交该 SQL 脚本,导致出现 bug 而测试中断,从而影响开发、测试的工作效率

我们可以使用 Git/ SVN 等工具进行代码的版本控制,同时,数据库也有对应的版本控制工具,可以记录数据库的变化记录

Flyway 是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等

官网首页:Homepage - Flyway (flywaydb.org)

特性

普通 SQL:纯 SQL 脚本(包括占位符替换)没有专有的 XML 格式,没有锁定

无限制:使用 Java 代码来进行一些高级数据操作

零依赖:只需运行在 Java6(及以上)和数据库所需的 JDBC 驱动

约定优于配置:迁移时,自动查找系统文件和类路径中的 SQL 文件或 Java 类

高可靠性:在集群环境下进行数据库升级是安全可靠的

云支持:完全支持 Microsoft SQL Azure, Google Cloud SQL & App Engine、Heroku Postgres 和 Amazon RDS

自动迁移:使用 Flyway 提供的 API,让应用启动和迁移同时工作

快速失败:损坏的数据库或失败的迁移可以防止应用程序启动

数据库清理:在一个数据库中删除所有的表、视图、触发器,而不是删除数据库本身

原理

当 Flyway 连接数据库中的 schema 后,会先检查是否已存在 flyway_schema_history 表,如果没有则创建。该表用于跟踪数据库的状态,如数据迁移的版本,迁移成功状态等信息

flyway_schema_history 存在后,Flyway 会扫描文件系统或应用中的 classpath 目录的数据迁移文件,然后根据它们的版本号进行按序迁移,如下图:

image.png

由于 flyway_schema_history 表中记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行

实战

数据库:MySQL 8.0

官方文档:Quickstart - API - Flyway - Product Documentation (red-gate.com)

Maven

首先新建 Maven 项目

image.png

添加依赖
xml
复制代码<!-- flyway --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>5.2.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.15</version></dependency>
创建迁移

首先我们需要创建迁移文件 src/main/resources/db/migration

然后配置数据库迁移文件,实施第一次迁移 src/main/resources/db/migration/V1__Create_person_table.sql

注意:V1 后面是两个下划线,必须是这样的格式

sql
复制代码
create table PERSON
(ID   int          not null,NAME varchar(100) not null
);

然后配置主启动函数

java
复制代码
public class App {public static void main(String[] args) {String url = "jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8";String user = "root";String password = "111111";Flyway flyway = Flyway.configure().dataSource(url, user, password).load();// 创建 flyway_schema_history 表
//		flyway.baseline();// 删除 flyway_schema_history 表中失败的记录
//		flyway.repair();// 检查 sql 文件
//		flyway.validate();// 执行数据迁移flyway.migrate();// 删除当前 schema 下所有表
//		flyway.clean();}}
执行程序

执行 App 程序

注:我们需要提前创建空数据库 flyway,如果 flyway 不是项目初期引入,后面会给出解决方案

image.png

然后我们可以看到现在已经创建了 flyway_schema_history 表和 PERSON 表,数据已经成功迁移到指定数据库中 image.png

现在如果系统升级,需要做数据迁移时,我们只需在 db/migration 目录下再放置新版本的 sql 文件即可

现在我们配置第二次迁移,创建文件 src/main/resources/db/migration/V2__Add_people.sql

sql
复制代码
insert into PERSON (ID, NAME)
values (1, 'Axel');
insert into PERSON (ID, NAME)
values (2, 'Mr. Foo');
insert into PERSON (ID, NAME)
values (3, 'Ms. Bar');

然后执行 App ,就可以看到如下执行成功

image.png

SpringBoot

下面整合 flyway 到 springboot

添加依赖

xml
复制代码<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId></dependency>

配置 application.yml

yml
复制代码
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&rewriteBatchedStatements=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: 111111flyway:enabled: true# 禁止清理数据库表clean-disabled: true# 如果数据库不是空表,需要设置成 true,否则启动报错baseline-on-migrate: true# 与 baseline-on-migrate: true 搭配使用baseline-version: 0# 不配置默认为 db/migration 目录locations:- classpath:db/migration/mysql

如果 flyway 不是项目初期引入,而是在数据库已有表的情况下引入时必须设置 baseline-on-migrate: true(此时没有配置 baseline-version: 0),设置该配置启动项目后,flyway 就会在数据库中创建 flyway_schema_history 表,并且会往该表中插入一条 version = 1 的建表记录,如果迁移数据有 V1__ 开头的文件,扫描文件会忽略该文件不执行迁移,进而可能引发其他迁移数据出错的问题

因为没有执行 V1__ 开头的文件,那么库中就不创建 PERSON 表,在迁移 V2 插入数据时就会插入失败

所以出现如上问题后,我们可以先删除flyway_schema_history 表,然后配置文件中设置 baseline-version: 0 即可,或者说修改数据迁移文件名称也是可行的

其他问题

版本问题

SpringBoot 2.4.4 集成 flyway 版本 7.1.1 (Oracle12.1.0.2 标准版可以执行,企业版不行)

SpringBoot 2.6.0 集成 flyway 版本 8.0.4 (Oracle12.1.0.2 都可以执行)

SQL 脚本命名规范

Prefix+Version+Separator+Description+Suffix

Prefix 前缀:V 代表版本迁移,U 代表撤销迁移,R 代表可重复迁移

Version 版本号:版本号通常 . 和整数组成

Separator 分隔符:固定由两个下划线 __ 组成

Description 描述:由下划线分隔的单词组成,用于描述本次迁移的目的

Suffix 后缀:如果是 SQL 文件那么固定由 .sql 组成,如果是基于 Java 类则默认不需要后缀

​最后

为了帮助大家更好的学习网络安全,小编给大家准备了一份网络安全入门/进阶学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂,所有资料共282G,朋友们如果有需要全套网络安全入门+进阶学习资源包。

😝有需要的小伙伴,可以点击下方链接免费领取

【一一帮助安全学习,所有资源获取处一一】

①网络安全学习路线

②20份渗透测试电子书

③安全攻防357页笔记

④50份安全攻防面试指南

⑤安全红队渗透工具包

⑥网络安全必备书籍

⑦100个漏洞实战案例

⑧安全大厂内部视频资源

⑨历年CTF夺旗赛题解析

1️⃣零基础入门

① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

2️⃣视频配套资料&国内外网安书籍、文档

① 文档和书籍资料

② 黑客技术

因篇幅有限,仅展示部分资料

如果你对网络安全入门感兴趣,需要的话可以在下方

3️⃣网络安全源码合集+工具包

4️⃣网络安全面试题

5️⃣汇总

所有资料 ⚡️ ,朋友们如果有需要全套 《网络安全入门+进阶学习资源包》,扫码获取~

这篇关于Flyway 数据库版本管理 | 专业解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

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

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

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ