flyway使用配置参数和注意事项介绍

文章目录

    • 业务场景
    • 参数介绍
      • initSqls
      • baselineOnMigrate
      • baselineVersion
      • target
      • validateOnMigrate
    • SQL注意事项

业务场景

  • 对于生产环境,随着项目版本迭代,数据库结构也会变动。如果一个项目在多个地方实施部署,且版本不一致,就需要一个方法来管理数据库结构。
  • flyway是个简单易用的轻量级数据库版本管理工具,可以让我们像使用 Git 管理代码一样,对数据库版本和变动,进行详细的记录
  • 使用flyway时,我们按照版本整理数据库SQL脚本,当发布新的项目版本时,同时发布SQL变动文件
  • 举例说明,对于第一个正式版本,我们的SQL文件包含数据库表初始化SQL,数据的初始化SQL;对于第二个版本,我们需要数据库表结构变动的SQL。每一个SQL文件都带有版本号,在各地实施时,会根据基础版本号和schema表里记录的情况,自动进行数据库结构校验和更新,保持表结构一致。
  • 对于新部署的项目,没有数据,可以不指定初始版本,直接从第一个数据库脚本开始执行,创建数据库,初始化数据,一直更新到需要的版本
  • 对于已经在运行的项目,数据库是已有的,里面也有客户的数据,不需要走创建数据库和初始化数据的过程。这时候需要设置基础版本的版本号,在进行表结构更新时,就会忽略之前的版本的SQL文件,只执行需要更新的SQL文件

参数介绍

  • 我的flyway的在spring boot应用里的application.yml配置
spring:datasource:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:postgresql://192.168.x.xx:5432/coreusername: xxxpassword: xxxxxxxhikari:poolName: Hikariauto-commit: falseflyway:enabled: trueschemas: publicencoding: UTF-8locations: classpath:db/migrationsql-migration-prefix: Vsql-migration-separator: __sql-migration-suffixes: .sqltable: flyway_schema_historybaseline-on-migrate: truevalidate-on-migrate: truebaseline-version: 2.0.0.1
  • enabled:默认true,是否启用flyway,设置为true,flyway才会生效
  • locations:默认classpath:db/migration,迁移脚本的位置
  • schemas:由 Flyway 管理的schema的名称(区分大小写)
  • encoding:默认UTF_8,SQL 迁移的编码
  • table:默认flyway_schema_history,Flyway 将使用的架构历史表的名称。
  • sqlMigrationPrefix:默认V,SQL 迁移的文件名前缀
  • sqlMigrationSuffixes:默认.sql,SQL 迁移的文件名后缀
  • sqlMigrationSeparator:默认__,SQL 迁移的文件名分隔符
  • repeatableSqlMigrationPrefix:默认R,可重复 SQL 迁移的文件名前缀
  • cleanDisabled:是否禁用数据库清理
  • cleanOnValidationError:验证错误时是否自动调用clean
  • baselineVersion:默认1,执行基线时用于标记现有模式的版本
  • target:应考虑迁移到的目标版本
  • initSqls:获取连接后立即执行初始化连接的 SQL 语句
  • baselineOnMigrate:迁移非空schema时是否自动调用基线
  • validateMigrationNaming:默认false,是否验证脚本不遵守正确命名约定的迁移和回调
  • validateOnMigrate:默认true,执行迁移时是否自动调用validate
  • 下面对于我有使用经验的,个人认为比较重要的几个参数,详细讲一下。

initSqls

  • 对于初次部署的系统,可以使用flyway新建表和初始化数据,但是没法新建库
  • 一开始想用init-sqls参数建库,发现不行
  • 一方面,在数据库连接参数url里就要指定库名了,如果这时候库还没创建,连接这个库的时候就会报错了,也不会进行下去
  • 另一方面,postgresql不支持create xx if not exists的用法,没法判断库不存在再去创建
  • initSqls参数,可以指定一些SQL语句,获取连接后立即执行初始化连接的 SQL 语句
  • 我没有需要在连接后执行SQL语句的场景,暂时未使用此参数

baselineOnMigrate

  • baseline-on-migrate参数,迁移非空schema时是否自动调用基线,主要是指数据库已存在,已经有数据库表和数据,此时开始使用flyway管理数据库的场景(此时flyway_schema_history表不存在)
  • schema(一般默认都是public)为空时,baseline-on-migrate参数就没有意义了,为空就直接走创建过程了,维护表结构时,会首先创建flyway_schema_history表,再去逐个执行SQL脚本
  • 在判断schema(一般默认都是public)非空时,设值为false,flyway_schema_history表不存在,就返回报错
    在这里插入图片描述
  • 在判断schema(一般默认都是public)非空时,设置为true,会去创建flyway_schema_history表,然后按照版本号逐个执行SQL文件

baselineVersion

  • baseline-version参数,指定基础版本,只有大于这个版本的SQL文件才会被检查和执行
  • 需要注意的是,只有在flyway_schema_history表不存在时,baseline-version参数才会生效
    在这里插入图片描述
  • flyway_schema_history表存在时,会根据表里的记录继续进行升级,baseline-version参数没有意义
  • 当schema表存在但表内容为空时,baseline-version参数同样没有意义,会根据locations的SQL文件,逐个版本升级,直到最新或者target版本
    在这里插入图片描述

target

  • 默认是迁移到最新版本,不配置时,就会根据locations的SQL文件,逐个版本升级,一直到全部文件执行完成
  • 如果指定版本号,则迁移到该版本,后续版本不升级
    在这里插入图片描述

validateOnMigrate

  • 默认true,执行迁移时自动调用validate,对SQL文件进行校验
  • 如果已有flyway_schema_history,会对里面的记录逐个校验checksum字段的值
  • 每个文件,会根据文件信息,生成一个 checksum 值,flyway在SQL文件执行时会在表里插入一条记录,包含checksum值
  • 当已经同步过的SQL文件发生变动时, checksum 值就会和数据库里的记录对应不上,就会校验失败
    在这里插入图片描述

SQL注意事项

  • 保证SQL能正确执行,可以多加些判断
  • 建表语句,新增字段的语句,可以多加一个IF NOT EXISTS
CREATE TABLE IF NOT EXISTS "public"."sys_log"
("id"      int8 NOT NULL,"op_desc" varchar(255) COLLATE "pg_catalog"."default","op_time" timestamp(6),CONSTRAINT "sys_log_pkey" PRIMARY KEY ("id")
);ALTER TABLE "public"."sys_setting" ADD COLUMN IF NOT EXISTS "enable_scheme_review" bool NOT NULL DEFAULT false;
  • 删除语句,可以多加一个IF EXISTS
ALTER TABLE "public"."wireless_security" DROP COLUMN IF EXISTS "dev_no";
ALTER TABLE "public"."bayonet" DROP CONSTRAINT IF EXISTS "fk_bayonet__intersection_id";
  • postgresql不支持create xx if not exists的用法,如果是增加外键、唯一键等操作,可以尝试先删除后新增,保证SQL一定执行成功
ALTER TABLE "public"."vip_traffic_movement" DROP CONSTRAINT IF EXISTS "fk_vip_traffic_movement__vip_route_config_id";
ALTER TABLE "public"."vip_traffic_movement" ADD CONSTRAINT "fk_vip_traffic_movement_vip_route_config_id" FOREIGN KEY ("vip_route_config_id") REFERENCES "public"."vip_route_config" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION;

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

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

相关文章

触发器和存储过程的区别

目录 触发器(Trigger) 定义和用途: 执行方式: 作用范围: 参数传递: 示例: 存储过程(Stored Procedure) 定义和用途: 执行方式: 作用范围…

CSS之粘性定位

让我为大家介绍一下粘性定位吧&#xff01; 大家应该都了解过绝对定位&#xff0c;它是相对于父级定位 那么粘性定位相对于谁呢&#xff1f; 它相对于overflow:hidden; 如果没找到就会跟fixed固定定位一样&#xff0c;相对于视口 <!DOCTYPE html> <html lang"en…

rust 引用/mut 的所有权

在任意给定时间&#xff0c;要么 只能有一个可变引用&#xff0c;要么 只能有多个不可变引用。 不可变引用&#xff08;shared reference&#xff09;实现了Copy trait&#xff0c;不会发生所有权转移可变引用&#xff08;mutable reference&#xff09;未实现&#xff0c;会发…

C++ 利用容器适配器,仿函数实现栈,队列,优先级队列(堆),反向迭代器,deque的介绍与底层

C 利用容器适配器,仿函数实现栈,队列,优先级队列【堆】,反向迭代器,deque的介绍与底层 一.容器适配器的介绍二.利用容器适配器实现栈和队列1.stack2.queue 三.仿函数介绍1.什么是仿函数2.仿函数的使用3.函数指针的使用1.函数指针的用处2.利用函数指针完成回调3.利用仿函数完成回…

Compose | UI组件(二) | Text() 文本组件

文章目录 Text() 简介Text() 参数说明Text() 显示文字fontSize 文字大小textAlign 文字对齐方式style 文字样式fontFamily 文字字体AnnotatedString 多样式文字maxLines 设置文本单行显示SelectionContainer 选中文字 总结 Text() 简介 显示文字的组件 Text() 参数说明 Comp…

免 费 小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

cg插画设计行业怎么样,如何学习插画设计

插画设计行业是一个充满创意和艺术性的行业&#xff0c;随着数字化时代的不断发展&#xff0c;cg插画的应用范围越来越广泛&#xff0c;市场需求也在逐年增长。以下是一些关于acg插画设计行业的现状和发展趋势&#xff1a; 市场需求不断增长&#xff1a;随着广告、媒体、影视、…

HCIA学习作业二

要求&#xff1a;基于192.168.1.0/24进行合理划分&#xff0c;要求全网通 [AR3]display ip interface brief [AR3]display ip routing-table [AR1]display ip interface brief [AR1]display ip routing-table [AR2]display ip interface brief [AR2]display ip routing-tab…

Element-plus修改样式

场景 通过样式穿透修改前端element组件样式。 实现 1.button按钮 ::v-deep .el-button { border-radius: 0; border: 0; background-color: rgba(0, 194, 255) !important; color: black; } 2.form表单 ::v-deep .el-form { text-align: left; .el-form-item { text-align: lef…

Hadoop3.x源码解析

文章目录 一、RPC通信原理解析1、概要2、代码demo 二、NameNode启动源码解析1、概述2、启动9870端口服务3、加载镜像文件和编辑日志4、初始化NN的RPC服务端5、NN启动资源检查6、NN对心跳超时判断7、安全模式 三、DataNode启动源码解析1、概述2、初始化DataXceiverServer3、初始…

C# 在矩形内获取一个指定大小的矩形(两个矩形的中心点是重合的)

C# 在矩形内获取一个指定大小的矩形&#xff08;两个矩形的中心点是重合的&#xff09; 示例1&#xff1a; using System.Drawing;public class RectangleUtils {public static Rectangle GetInnerRectangle(Rectangle outerRectangle, Size innerSize){// 计算内部矩形的左上…

MySQL的数据锁表(data_locks 表)

data_locks 表显示了持有和请求的数据锁。关于哪些锁请求被哪些持有的锁阻塞的信息。 示例数据锁信息&#xff1a; mysql> SELECT * FROM performance_schema.data_locks\G *************************** 1. row ***************************ENGINE: INNODBENGINE_LOCK_ID:…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…

PyQt中的信号/槽以及纯python实现信号/槽设计模式

1.信号与槽的基本概念 在PyQt中&#xff0c;信号是一种对象间通信的机制。当某个特定事件发生时&#xff0c;一个信号被发射。槽是接收信号的方法&#xff0c;当信号被发射时&#xff0c;与之连接的槽会被调用。这种机制使得不同部分的代码能够松耦合地交流。 2.PyQt中的信号与…

【模拟算法系列】详解5道题

本文讲解模拟算法系列的5道经典题&#xff0c;在讲解题目的同时提供AC代码&#xff0c;点击题目即可打开对应OJ链接 目录 模拟算法的介绍 1、替换所有的问号 2、提莫攻击 3、 Z 字形变换 4、外观数列 5、数青蛙 模拟算法的介绍 题目中明确告诉你要干什么&#xff0c;思路…

C++ //练习 3.3 请说明string类的输入运算符和getline函数分别是如何处理空白字符的。

C Primer&#xff08;第5版&#xff09; 练习 3.3 练习 3.3 请说明string类的输入运算符和getline函数分别是如何处理空白字符的。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 cin读取并忽略有效字符之前所有的空白字符&…

打开文件:内核做了什么

一.文件描述符本质 文件描述符的是一个非负整数&#xff0c;它是操作系统内核用来标识和管理打开文件的抽象概念。在 Linux 和其他类 Unix 操作系统中&#xff0c;几乎所有与文件相关的操作都是通过文件描述符来进行的。 文件描述符是操作系统内核为每个进程维护的一个表&…

ChatGPT 和文心一言 | 两大AI助手哪个更胜一筹

欢迎来到英杰社区&#xff1a; https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区&#xff1a; https://bbs.csdn.net/topics/617897397 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff…

Web开发4:单元测试

在Web开发中&#xff0c;单元测试是一种重要的开发实践&#xff0c;它可以帮助我们确保代码的质量和可靠性。通过编写和运行单元测试&#xff0c;我们可以验证代码的正确性&#xff0c;减少错误和缺陷&#xff0c;并提高代码的可维护性。本文将介绍单元测试的概念、好处以及如何…

券商既然是发行债券的人,为什么他还收中介费呢?

券商在金融市场中扮演着多种角色&#xff0c;其中发行债券只是其业务的一部分。券商作为金融中介机构&#xff0c;其主要功能是为投资者和融资者提供撮合服务&#xff0c;促进金融市场的有效运行。 当券商作为发行债券的角色时&#xff0c;它们会帮助公司或政府等机构发行债券…