热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

假如我们有一个叫shiny的项目,它是由一个程序Shiny-Server和一个数据库Shiny-DB组成的;简单结构图如下:image.png但是很多时

假如我们有一个叫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软件编程知识和程序员发展职业之路,欢迎关注!



推荐阅读
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文旨在解决 MySQL 无法连接到 localhost 的常见问题,并提供详细的步骤来确保 MySQL 服务正确启动和配置。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装Docker Desktop以确保本地环境准备就绪。接下来,可以从Docker Hub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
author-avatar
小玎子_649
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有