flyway版本号_Flyway版本化管理数据库脚本

假如我们有一个叫shiny的项目,它是由一个程序Shiny-Server 和一个数据库 Shiny-DB组成的;

简单结构图如下:

image.png

但是很多时候,现实开发团队是这样的:

image.png

我们的项目shiny项目的运行环境是有多套的,

我们擅长解决代码层面的问题。

版本控制工具git非常普遍而且好用

我们有持续集成和持续构建的工具

我们很好的定义了测试和生产环境的发布流程

image.png

但是我们的数据库的版本如何控制呢?

image.png

当前现状

非常不幸的是我们还不能很好的处理数据库的版本管理问题,

很多的项目依赖运维人员手动的执行SQL脚本,

有的时候甚至为了快速解决bug去快速的在命令行上执行SQL脚本,那么问题来了。

通常这些问题的答案是:鬼知道。

引入目的

flyway解决了上面的这些问题。

目前Flyway支持的数据库还是挺多的,包括:

Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS,

MySQL(including Amazon RDS), MariaDB,

Google Cloud SQL, PostgreSQL(including Amazon RDS and Heroku),

Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA,

solidDB, Sybase ASE and Phoenix。

Flyway的执行流程

Flyway是一款开源的数据库版本管理工具,

它更倾向于规约优于配置的方式。

Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,

并且有一套默认的规约,不需要复杂的配置,

Migrations可以写成SQL脚本,也可以写在Java代码中,

不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,

同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。

Flyway工作流程.png

每次不管是数据库的表结构或者表数据的变更,

你只需要把问题当成一次数据库的升级,

简单的创建一个比当前版本更高的版本的迁移SQL文件或者Java文件,

下次Flyway启动的时候,他会找到这些脚本并把它更新到数据库。

脚本或者Java迁移脚本的命名规则:

其中的文件名由以下部分组成,除了使用默认配置外,某些部分还可自定义规则。

prefix: 可配置,前缀标识,默认值V表示Versioned,R表示Repeatable

version: 标识版本号,由一个或多个数字构成,数字之间的分隔符可用点.或下划线_

separator: 可配置,用于分隔版本标识与描述信息,默认为两个下划线__

description: 描述信息,文字之间可以用下划线或空格分隔

suffix: 可配置,后续标识,默认为.sql

实现路径

真实项目版本更新场景中,我们不可能再基于人力去做这件事情,我们选择的是API的方式。

使用步骤如下:

API方式使用Flyway.png

一般大家都是写SQL脚本,也支持通过写Java代码的方式来实现。

Java方式写迁移功能

使用步骤:

Java代码方式写迁移代码.png

目前的集成方式

使用的是springboot的方式集成了Flyway;

COLA引入Flyway的流程.png

配置参数:可自行翻译和参考选择去配置

flyway.baseline-description= # The description to tag an existing schema with when executing baseline.

flyway.baseline-version=1 # Version to start migration.

flyway.baseline-on-migrate=false # Whether to execute migration against a non-empty schema with no metadata table

flyway.check-location=false # Check that migration scripts location exists.

flyway.clean-on-validation-error=false # will clean all objects. Warning! Do NOT enable in production!

flyway.enabled=true # Enable flyway.

flyway.encoding=UTF-8 # The encoding of migrations.

flyway.ignore-failed-future-migration=true # Ignore future migrations when reading the metadata table.

flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it.

flyway.locations=classpath:db/migration # locations of migrations scripts.

flyway.out-of-order=false # Allows migrations to be run "out of order".

flyway.placeholder-prefix= # The prefix of every placeholder.

flyway.placeholder-replacement=true # Whether placeholders should be replaced.

flyway.placeholder-suffix=} # The suffix of every placeholder.

flyway.placeholders.*= # Placeholders to replace in Sql migrations.

flyway.schemas= # Default schema of the connection and updating

flyway.sql-migration-prefix=V # The file name prefix for Sql migrations

flyway.sql-migration-separator=__ # The file name separator for Sql migrations

flyway.sql-migration-suffix=.sql # The file name suffix for Sql migrations

flyway.table=schema_version # The name of Flyway's metadata table.

flyway.url= # JDBC url of the database to migrate. If not set, the primary configured data source is used.

flyway.user= # Login user of the database to migrate. If not set, use spring.datasource.username value.

flyway.password= # JDBC password if you want Flyway to create its own DataSource.

flyway.validate-on-migrate=true # Validate sql migration CRC32 checksum in classpath.

package db.migration;

/**

* @author carter

* create_date 2020/8/13 17:39

* description java数据库变更模板代码

*/

import lombok.extern.slf4j.Slf4j;

import org.flywaydb.core.api.migration.BaseJavaMigration;

import org.flywaydb.core.api.migration.Context;

import java.sql.ResultSet;

import java.sql.Statement;

@Slf4j

public class V2__test extends BaseJavaMigration {

@Override

public void migrate(Context context) throws Exception {

try (Statement select = context.getConnection().createStatement()) {

try (ResultSet rows = select.executeQuery("SELECT 1")) {

while (rows.next()) {

int id = rows.getInt(1);

String anonymizedName = "Anonymous" + id;

log.info("执行sql脚本:{}",anonymizedName);

}

}

}

}

}

资料来源

如有问题,请留言。

原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

我会持续分享Java软件编程知识和程序员发展职业之路,欢迎关注!

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

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

相关文章

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里,我一直在探索Netflix Hystrix库,并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容: Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点&#xff0c…

89 个嵌入式相关概念,你懂几个?

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删01操作系统(Operating System,OS)是管理计算机硬件与软件资源的系统软件,同时也是计算机系统的内…

python源码笔记_python源码学习笔记(二)

(二) python 继承和多态这非常类似C的功能,只不过是是在C基础上开发的。由上一节知,python的所有对象的基础都是PyObject,所以例如创建一个PyIntObject对象,是通过PyObejct*变量来维护,所以在python内部各个函数之间传…

linux 延时一微秒_让我们暂停一微秒

linux 延时一微秒低延迟Java应用程序中的许多基准测试涉及必须在一定负载下测量系统。 这就要求保持事件进入系统的稳定吞吐量,而不是在没有任何控制的情况下以全油门将事件泵入系统。 我经常要做的任务之一是在事件之间将生产者线程暂停一小段时间。 通常&#xf…

C语言不是最好的,却是我最爱的~

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删以下为译文:虽然 C 语言并不是我所学的第一门语言,也不是我的最后一门语言,但是我仍然非常喜欢 C&#xff0c…

vue 传递多行数据_vue父组件向子组件传递多个数据的实例

在平时我们使用VUE组件的时候,经常需要将父组件的某些数据传递给子组件,这个时候,我们通常会有很多的办法,这里主要分为两种情况:第一种:静态数据传递:传递一个 字符串第二种:动态数…

lucene 源码分析_Lucene分析过程指南

lucene 源码分析本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中…

ggplot2箱式图两两比较_R语言进阶笔记2 | 长数据与ggplot2

1. 长数据是什么鬼?之前介绍了如何将多个性状的箱线图放在一个图上,比如learnasreml包中的fm数据,它有h1~h5五年的株高数据,想对它进行作图。「数据预览:」> library(learnasreml)> data(fm)> head(fm) Tree…

面向对象,C语言实现简单工厂模式,思路+代码

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删1、简介简单工厂方法定义一个用于创建对象的类,该类接受一个参数,通过参数决定创建不同的对象。GOF并没有把简单工厂方法…

javaone_JavaOne和OOW 2015总结

javaone大家好! 终于,我回来了一个很棒的JavaOne和OOW2015。在这篇文章中,我想分享我的经验,一些照片和我参加的演讲的摘要。 会议前 我于2015年6月24日星期六乘Copa航空公司CLO-PTY-SFO飞往旧金山。 从哥伦比亚出发(…

如何导出久其报表所有数据_如何选择好的HR软件

相信HR朋友想要换HR系统的时候,一般都会在百度、360和搜狗上找,或者通过朋友介绍,而自己百度找的时候,就会出现很多HR软件的广告,一个一个的去问,也不一定能问出所以然,所以就约着面谈&#xff…

网站快速变灰色,几行代码就搞定了!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删自从伟大的江爷爷走了后,全站和各个App的内容都变成了灰色,包括按钮、图片等等。这时候我们可能会好奇这是怎么做到的呢&…

java 递归 堆栈_Java中的堆栈安全递归

java 递归 堆栈在本文中,摘自《 Java中的函数编程 》一书,我解释了如何使用递归,同时避免了StackOverflow异常的风险。 Corecursion正在使用第一步的输出作为下一步的输入来构成计算步骤。 递归是相同的操作,但是从最后一步开始。…

cshtml中引用css_css基础必备-使用样式,前端小白一看就会

在HTML文档中包含CSSCSS可以作为单独的文档引用,也可以嵌入到HTML文档中。在HTML文档中包含CSS有三种方法:内联样式 - 使用元素起始标记的style属性指定样式嵌入样式 - 在文档的head部分使用style标记指定样式外部样式 - 在文档的head部分使用link标记引…

嵌入式软件分层框架设计,举个例子

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删前言为了能够使得产品得到更好的开发速度与以后更好的迭代和移植,框架分层是很有必要的。但如对于中小型项目严格遵循这些原则&#…

mockito入门_Mockito入门

mockito入门本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证的…

windows7安dns服务器_在Windows 7 上安装DNS服务器bind9方法详解

本文主要介绍在WIN7上利用ntbind部署DNS服务器的方法。ntbind是Bind的Windows版本,1.下载BIND9.11下载地址:http://ftp.isc.org/isc/bind9/9.11.0rc3/。我的系统是window 7 64位需要下载BIND9.11.0rc3.x64.zip,建议下载9.11以上的版本&#x…

腾讯大举退出美团!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删11月16日,腾讯发布第三季度财报,同时表示将“分红式减持”美团。腾讯分派90.9%美团持股 腾讯系中概股美股盘前多数下跌腾…

csr8670 修改key_CSR8670 DFU user guide

DFU使用1)产生DFU keys:dfukeygenerate.exe -o keys或dfukeygenerate.exe -o keys -r random.txt生成keys.private.key和keys.public.key两个文件。2)loader和firmware签名:a)dfukeyinsert.exe -v -o loader_signed -lC:\ADK_CSR867x.WIN4.3.1.5\firmwar…

matchers依赖_Hamcrest Matchers教程

matchers依赖本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证…