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

2024-01-27 08:12

本文主要是介绍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;

这篇关于flyway使用配置参数和注意事项介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

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

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

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经