在SpringBoot中使用flyway进行数据库版本管理
本文大纲
- flyway是什么
- 能帮助我们解决什么问题
- springboot环境下使用flyway
- flyway的工作原理
一、flyway是什么
Flyway是一个开源的数据库版本管理工具,并且极力主张“约定大于配置”,简单、专注、强大。可以使用SQL完成数据同步,或者基于特定数据库的语法(例如PL / SQL,T-SQL等)或Java代码(适用于高级数据转换或处理LOB)的方式编写。并且数据库支持非常广泛:
二、能帮助我们解决什么问题
那么,我们首先解释一下什么是数据库版本管理?
- 大家都知道git是帮助软件项目进行代码版本的管理,方便程序员协同开发
- 那么FlyWay就是数据库版本管理的工具,目标是保证多环境下数据库的状态一致性,方便程序员协同开发
举个简单的例子:
- 开发人员通常使用同一个数据库或者自建库进行开发工作,这个数据库通常叫做开发库。
- 测试人员为了保障测试数据的有效性,通常自建一个库进行测试,这个数据库叫做测试库。
- 销售人员为了保证演示数据的效果,通常也需要一个单独的数据库,这个数据库叫做演示库。
- 正式生产上线的库,供给用户使用,这个数据库叫做生产库。
那么问题就来了:我们如何保证数据库schema的状态一致?某一个开发人员修改了开发库,新增了一个字段,如何能够有效的同步到测试库,测试通过之后如何有效的同步到演示库和生产库?在没有Flyway之前,这个动作通常是由上线程序员自己去执行SQL来完成的,或者比较正规的公司专门有版本管理人员去操作。这种方式通常存在几个问题:
- 开发团队内部的沟通成本增加,比如某一个成员修改了一个数据库字段,其他人可能都不知道。
- 开发团队和测试团队和其他团队之间的沟通成本增加
- 无法完成自动化的持续集成,持续集成的过程代码可以通过git、maven、docker、k8s等工具来实现自动化的代码打包、部署。但是数据库的状态变化没有得到有效的自动变更,持续集成的过程的自动化就无法实现。
这也就是我们学习Flyway的目的:Flyway能够自动的帮助我们有效的同步各个发布数据库之间的状态,不管你是加了或者删了一个字段,还是新加了一张表,他都能自动化的跟随项目的发布同时发布。
三、 springboot环境下使用flyway
首先,我们为SpringBoot项目添加Flyway依赖
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.0.7</version>
</dependency>
然后我们要保证数据库里面有spring.datasource的数据源配置。并且在application.properties中添加如下的配置
spring:
flyway:
enabled: true #启用flyway
encoding: utf-8 #字符编码
locations: ["classpath:db/migration"] #版本控制文件存放目录
然后在resources/db/migration目录下面,加入如下格式的脚本:
V1.1__create_table.sql
V1.2__update_person_table.sql
V1.3__create_new_table.sql
V1.4__add_person_comment.sql
V2.1__modify_person_data.sql
大写V后面紧跟数据库脚本的版本号(递增形式、不能重复),然后两个下划线,之后是对脚本内容进行描述。如:V1.1__create_table.sql是用于创建表结构的数据库脚本,内容是create table之类的DDL。 第二个脚本是对数据库中person表进行了更新。总之脚本里面的内容,就是你希望对spring.datasource代表的数据库进行的操作,可以是表的创建、删除、修改,也可以是对数据的创建删除修改。
当然,我个人不建议将DML-SQL写入脚本,也就是不要在这个脚本里面写insert、update、delete。以免不注意的情况下,造成生产数据的误操作。如果你们公司在生产上线管理方面没有严格的审核程序,在生产环境下,就干脆不要使用flyway,方便开发是一方面,生产安全更为重要!
最后,启动SpringBoot项目,在该目标库范围内没有执行过的SQL脚本被执行。并将脚本执行信息保存在数据库的schema_version_history数据表里面。
四、FlyWay的工作原理
- 首先项目启动flyway会去db/migration下面扫描文件,获取文件名,并解析版本号
- 然后去schema_version_history表里面找对应的版本执行信息,如果你的文件版本号大于数据库记录版本,就执行脚本。否则就忽略。
期待您的关注
- 博主最近新写了一本书:《手摸手教您学习SpringBoot系列-16章97节》
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
在SpringBoot中使用flyway进行数据库版本管理的更多相关文章
- SpringBoot系列: 使用 flyway 管理数据库版本
Flyway 和 Liquibase 都是 Java 项目中常用的 DB migration 工具, 从使用简便性看,Flyway 比 Liquibase 更简单, 从 github 的 star ...
- 转:SpringBoot系列: 使用 flyway 管理数据库版本
Flyway 和 Liquibase 都是 Java 项目中常用的 DB migration 工具, 从使用简便性看,Flyway 比 Liquibase 更简单, 从 github 的 star 数 ...
- SpringBoot中Redis的set、map、list、value、实体类等基本操作介绍
今天给大家介绍一下SpringBoot中Redis的set.map.list.value等基本操作的具体使用方法 上一节中给大家介绍了如何在SpringBoot中搭建Redis缓存数据库,这一节就针对 ...
- SpringBoot整合Flyway(数据库版本迁移工具)
简介 在团队开发当中,有可能每个人都是使用自己本地的数据库.当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新. Flyway数据库版本迁移工具,目的就是解决该问题而诞生的(我自己想的). ...
- Spring Boot中使用Flyway来管理数据库版本
flyway是一个开源的数据库迁移工具.类似于数据库的版本控制工具.flyway的数据库修改文件默认放在resource下的db.migration文件夹中,以V{version_number}__{ ...
- [jOOQ中文]3. 数据库版本管理工具Flyway
https://segmentfault.com/a/1190000010526452 在执行数据库迁移时,我们推荐使用jOOQ与Flyway - 数据库迁移轻松. 在本章中,我们将简单的来使用这两个 ...
- springboot 中使用Druid 数据源提供数据库监控
一.springboot 中注册 Servlet/Filter/Listener 的方式有两种,1 通过代码注册 ServletRegistrationBean. FilterRegistration ...
- SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理
在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...
- 数据库版本管理工具--Flyway的使用
软件开发正常流程是:开发环境 ---> 测试环境 ----> 产环境 在开发过程中经常需要变更数据库: 表结构变更. 基础数据变更. 最直接的做法是:用客户端连上数据库直接修改. 依次修 ...
随机推荐
- EL十一大内置对象
这是一个内置对象可以直接拿来使用,不需要再去声明. 1.读取页面上下文: (1)pageContext对象: 获取URL和URI: <body> URI:${pageContext.req ...
- Scala XML
XML 直接在代码中使用 XML 字面量 val doc: Elem = <html><head><title>Test</title></hea ...
- Bumblebee服务网关之统一请求验证
对于微服务网关来说,统一请求验证是一个比较重要和常用的功能,通过网关验证后台服务就无须关注请求验证:对于多语言平台的服务而言制定验证方式和变更验证配置都是一件比较繁琐和工作量大的事情.Bumblebe ...
- 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统
前言 今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么 首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...
- Thinkphp5.0第三篇
批量插入数据 //新增一条数据的方法 public function add() { /*$user =new UserModel(); $user->id=1; $user->name= ...
- Flume 学习笔记之 Flume NG+Kafka整合
Flume NG集群+Kafka集群整合: 修改Flume配置文件(flume-kafka-server.conf),让Sink连上Kafka hadoop1: #set Agent name a1. ...
- vue.js 实战 todo list
vue.js 起源 vue.js 的作者是尤雨溪,是一名中国人,之前在谷歌工作,现在在全职维护 vue 项目. vue.js 是 2014 年推出来的.现在已经更新到 2.x 版本,3.0 版本会在 ...
- Linux下mysql相关操作
Linux下mysql相关操作 1.创建MySQL mysql -u root -p create user 'username'@'%' identified by 'password'; %可以选 ...
- 【JavaScript】使用纯JS实现多张图片的懒加载(附源码)
一.效果图如下 上面的效果图,效果需求如下 1.还没加载图片的时候,默认显示加载图片背景图 2.刚开始进入页面,自动加载第一屏幕的图片 3.下拉界面,当一张图片容器完全显露出屏幕,即刻加载图片,替换背 ...
- vue3.0 vue.config.js 配置实战
今天讲述一下vue-config.js配置,我们前面搭建好脚手架会发现,这个对比2.x版本少了很多东西,没有build的配置,也没有webpack的配置,那么问题来了,我们如何去开发我们的项目呢,比如 ...