flyway快速入门

news2024/12/27 4:26:22

flyway快速入门

      • 一、flyway是什么?
      • 二、flyway使用目的
          • 1. 使用原因:
          • 2. 举个例子:
      • 三、flyway工作原理
      • 四、flyway使用约定和命名规则
          • 1. 数据库版本文件整体约定
          • 2. 数据库版本文件夹管理约定
          • 3. 数据库版本文件命名约定
          • 4. 禁止项
      • 五、flyway配置和使用(springboot整合,进行配置连接和测试)
        • 1、添加pom依赖
        • 2、yml(或properties)文件中配置flyway
        • 3. 建立一个空表数据库
        • 4. 添加resources文件
        • 5.添加sql脚本(.sql版本文件)
        • 6.在sql脚本中写sql语句
        • 7.启动项目
      • 六、其他知识
      • 七、关于flyway配置使用描述

一、flyway是什么?

  1. 概念:Flyway 是一款开源的数据库版本管理工具。

  2. 数据库版本文件:存放在版本文件目录下的sql脚本(就是我们放在db.migration下的文件)

ps:flaway可以在命令行中使用,或者在java应用程序中引入(但是一般就是在项目中进行数据库版本迭代),可以相对简单的对数据库版本进行控制。

二、flyway使用目的

1. 使用原因:

在项目或产品中,很难一开始就把业务理清楚,所以很难一次性把数据库表设计好;(比如:我们现在建了一个表进行使用,过了一段时间甲方爸爸突然要求加个字段或者修个某个字段信息,这个时候我们就又得去修改数据库表;又过了几天甲方爸爸又说…如此折腾几下:干他!!!所以说数据表也会在周期内不断迭代)因此我们就需要在更新修改数据库的时候做记录,提交一次更新结果就记录下来,不同的人做不同的记录,这样就可以方便大家去看之间的版本情况;

2. 举个例子:

在协同开发时候,大家一般都是使用Git来对代码做版本控制,主要的目的一个是为了协调开发的方便性,再一个就是为了解决多人开发代码冲突和版本回退的问题。

解释一下什么是版本:

git:在git中,比如我写了一个业务逻辑,实现了某个功能,然后我就把这个项目push到git中去让测试或者其他人去联调使用。我们把这次提交就称为一个版本;后续我还会多次对代码进行修改,每一次提交就是一个版本;

flyway:同样的在flyway中,每一次提交的sql命令就是一个版本(创建、更改等等),而每一次的sql命令中会包含多个sql语句;

三、flyway工作原理

flyway工作流程如下:

  1. 启动一个项目,数据库连接建立成功后,Flyway开始自动运行;
  2. 初次使用时,flyway会创建一个 flyway_schema_history 表,用于记录sql执行记录;
  3. Flyway会扫描项目指定路径下(默认是 classpath:db/migration )的所有sql脚本,与 flyway_schema_history 表脚本记录进行比对
  4. 如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。
  5. 如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。

四、flyway使用约定和命名规则

1. 数据库版本文件整体约定
  • 一份数据库版本文件可包含多条操作数据库的sql命令。

在一次提交中将所有需提交的数据库变更维护在同一个数据库版本文件中,无需也没有必要为每一条语句新增一个版本文件。如:在初始化的版本文件中包含了整套建表语句与初始化数据sql。

  • 数据库版本文件使用新增的方式进行管理,提交git后不允许修改。

该条约定的意思为若已添加某个数据库版本,此时又需要补充内容(或者纠错某些内容),不允许修改之前的版本文件,只能通过新增一份版本文件对数据库进行操作。可以结合svn版本管理进行理解,文件在提交后版本即固定,再想修改文件需要提交新版而旧版本的记录不变。

2. 数据库版本文件夹管理约定
  • db/migration文件夹

此文件夹为通用版本文件目录,里面存放的数据库版本文件是所有环境所共有的,所有环境在启动时均会执行此文件夹下的数据库版本文件(较当前版本新的部分)。

  • 特定环境文件夹均需放在db文件夹下,命名需与环境名称一致。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-juf0damE-1691141471397)(F:\计算机\图片源\flyway\文件夹管理约定.png)]

此文件夹下的数据库版本文件只会在相应环境下执行。

3. 数据库版本文件命名约定
  • 整体命名规则

整体规则为V[version]__[name].sql。名称中[version]和[name]之间是两个下划线,[version]部分使用时间戳-年月日时分秒_

(例:20190625143301),[name]描述sql作用,使用单词描述并使用“_”分隔。

举例:V20230804153701__today_creat(注意today之前是两个下划线)

  • 单一功能的版本文件[name]部分规则

    • 纯数据操作的使用data_开头
    • 新增数据使用_add结尾
    • 修改数据使用_mod结尾
    • 删除数据使用_del结尾
  • 复合功能的版本文件(版本文件中包含多种不同的类型的操作命令) [name]部分命名尽量表达出此次版本变化内容。

4. 禁止项
  • 添加表字段只能用ALTER…ADD,严禁删表重建。

删表重建会删除生产环境的所有表数据,严格禁止!!

  • 已提交的数据库版本文件严禁再修改提交。

一旦提交了数据库版本文件,则有可能被其他同事拉取启动或者部署开发、生产环境对数据库做相应变更,若再修改同一个版本文件提交会对他人或公共环境数据库造成破坏或经flyway检测不通过无法启动!

  • 开发、测试、生产等公用环境原则上不允许直接修改flyway_schema_history表。

flyway_schema_history是数据库记录当前数据库版本信息的表。在不熟悉工具时进行操作会造成数据库结构及数据问题。

  • 原则上禁止执行删表,删数据相关sql。

所有维护的数据库版本文件最终均会部署生产环境,删表与删数据必须慎重确定不会影响生产环境功能及不会丢失生产环境有用数据时才可进行。在不熟悉工具时进行操作会造成数据库数据丢失。

五、flyway配置和使用(springboot整合,进行配置连接和测试)

1、添加pom依赖

 <!--导入flyway依赖-->
 找到dependencies父标签,在里面添加如下依赖
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>${flyway.version}</version>
        </dependency>

2、yml(或properties)文件中配置flyway

以pg数据库为例:

spring:
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://localhost:5432/你的数据库
    username: 你的账户名称
    password: 你的密码
  # flyway数据库版本控制
  flyway:
    # 激活flyway
    enabled: true
    # 编码格式
    encoding: UTF-8
    # 禁止清楚数据库表
    clean-disabled: true

    # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略
    baseline-version: 1
    # sql文件目录
    locations: classpath:db/migration
    # 迁移sql脚本文件名称的前缀,默认V
    sql-migration-prefix: V
     # 迁移sql脚本文件名称的分隔符,默认2个下划线__
    sql-migration-separator: __
     # 迁移sql脚本文件名称的后缀
    sql-migration-suffixes: .sql
    # 迁移时是否进行校验,默认true
    validate-on-migrate: true
    # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    # 如果指定 schema 包含了其他表,但没有 flyway schema history 表的话,设置为 true 后, flyway 将在需要 baseline 的时候, 自动执行一次 baseline
    baseline-on-migrate: true
    # 设置为true,当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    baselineOnMigrate: true

3. 建立一个空表数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWo8216Z-1691141471398)(F:\计算机\图片源\flyway\空表.png)]

4. 添加resources文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bGXL7FD9-1691141471399)(F:\计算机\图片源\flyway\添加db.png)]

5.添加sql脚本(.sql版本文件)

6.在sql脚本中写sql语句

7.启动项目

启动项目以后,在不报错的情况下,我们这个时候就可以在数据库看见我们的flyway_schema_history 表,它里面以后存储的就是我们每次迭代的版本记录;同时我们在这里创建了一个表student也会在数据库中看到;此时说明整合成功!恭喜你可以使用了

flyway_schema_history 表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iRVKzvri-1691141471399)(F:\计算机\图片源\flyway\schema.png)]

student表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aUOPEdkX-1691141471400)(F:\计算机\图片源\flyway\数据库表.png)]

六、其他知识

  • flyway执行migrate必须在空白的数据库上进行,否则报错。
  • 对于已经有数据的数据库,必须先baseline,然后才能migrate。
  • clean操作是删除数据库的所有内容,包括baseline之前的内容。
  • 尽量不要修改已经执行过的SQL,即便是R开头的可反复执行的SQL,它们会不利于数据迁移。
  • 当需要做数据迁移的时候,更换一个新的空白数据库,执行下migrate命令,所有的数据库更改都可以一步到位地迁移过去。
  • 已经提交的版本建议不要再去数据库进行修改,当觉得这次提交有失误时候,重新进行一次版本迭代进行提交

七、关于flyway配置使用描述

flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true

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

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

相关文章

微信多开(双开三开均可,且不局限于微信,其他设备亦可)

1.鼠标右键“微信”&#xff0c;属性 如上图&#xff0c;自动选取的&#xff0c;别动&#xff0c;然后CtrlC,,,,结果如下 "C:\Program Files (x86)\Tencent\WeChat\WeChat.exe" 2.创建文本&#xff0c;电脑桌面空白处单击&#xff0c;新建&#xff0c;文本档案&#…

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

安卓:BottomNavigationBar——底部导航栏控件

目录 一、BottomNavigationBar介绍 二、BottomNavigationBar的常用方法及其常用类 &#xff08;一&#xff09;、常用方法 1. 添加菜单项 2. 移除菜单项 3. 设置选中监听器 4. 设置当前选中项 5. 设置徽章 6. 样式和颜色定制 7. 动画效果 8. 隐藏底部导航栏。 9、设…

局域网新大陆?

操作后&#xff0c;即可实现局域网互通。

【java】民营医院、门诊部、连锁集团、公立医疗云HIS系统源码

基于云计算技术的B/S架构的医院管理系统(简称云HIS)&#xff0c;为医疗机构提供标准化的、信息化的、高效可靠的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。利用云计算平台的技术优势&#xff0c;建立统一的云HIS、云病历、云P…

性能监控工具-Grafana安装和使用方法

Grafana是一款开源的数据可视化和监控平台。它提供了丰富的可视化方式&#xff0c;如图表、仪表盘、警报等&#xff0c;支持多种数据源&#xff0c;包括Prometheus、InfluxDB、Graphite等&#xff0c;适用于各种规模的系统监控和数据分析。Grafana还有一个强大的插件生态系统&a…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

淘宝店铺数据API接口 店铺详情数据API 店铺所有商品API接口

引言 在电商平台上&#xff0c;店铺所有商品API接口是一项非常重要且有着广泛应用的技术。它使得开发者能够方便地获取和管理店铺中的所有商品信息&#xff0c;进而实现自动化的商品管理和数据分析。本文将详细介绍店铺所有商品API接口的定义、功能以及调用流程&#xff0c;并附…

王道《操作系统》学习(二)——进程管理(三)

2.3.1 进程同步、进程互斥 &#xff08;1&#xff09;进程同步 &#xff08;2&#xff09;进程互斥 “同时”指的是宏观上的同时&#xff0c;微观上可能这些进程是交替地在访问这些共享资源的 当“上锁”后&#xff0c;其他的进程想要访问临界资源时&#xff0c;在进入区进行检…

js修改png图片颜色

思路是利用canvas 改变图片颜色 /*** 将png图片转成目标颜色* param imgUrl 可传入图片URL 或者 Base64* param RGBArr 要换成的目标颜色RGB 数组格式[R,G,B]* param Functon callback回调*/ function changeImageColor(imgUrl, RGBArr, callback) {let image new Image();im…

人工智能大模型中token的理解

“token”是当前语言类模型的数据单位。当前的自回归语言模型是根据 token 来作为单位进行数据处理和计算&#xff0c;分词&#xff08;tokenization&#xff09;就是将句子、段落、文章这类型的长文本分解为以 token 为单位的数据结构&#xff0c;把文本分词后每个词表示成向量…

小白入门Java第一天

当你对 Java语言有了一些了解后&#xff0c;你就可以开始着手学习Java了。 作为你的Java 学习第一天&#xff0c;所需掌握内容如下述目录&#xff1a; 文章目录 1. 注释1. 三种注释1.1 单行注释1.2 多行注释1.3 文档注释 2. 标识符和关键字2.1 标识符的组成&#xff1a;2.2 那…

C++11新特性lambda 表达式

lambda 表达式 lambda 表达式 lambda 表达式 Lambda 表达式的基本语法是&#xff1a;[] (参数列表) -> 返回值类型 {函数体}。 方括号([])表示捕获列表&#xff0c;用来指定在 lambda 表达式中可以访问的外部变量。 参数列表和返回值类型与普通函数的参数列表和返回值类型相…

写字楼门禁如何管理?最最新方法来了!

在现代社会&#xff0c;随着城市化和商务发展的蓬勃推进&#xff0c;大厦写字楼作为繁忙的商业中心和办公场所&#xff0c;其安全管理和员工考勤变得尤为重要。为了应对这一挑战&#xff0c;人脸门禁考勤机应运而生&#xff0c;成为大厦写字楼的安全保障和工时管理的关键工具。…

翻译公司提供哪些口译服务,北京翻译哪里比较专业?

我们知道&#xff0c;口译服务是一种即席的现场翻译活动&#xff0c;在涉外沟通交流中起着至关重要的作用。那么&#xff0c;如何做好口译工作&#xff0c;翻译公司提供哪些口译服务&#xff0c;北京翻译哪里比较专业&#xff1f; 据了解&#xff0c;相对于笔译&#xff0c;口译…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(27)-Fiddler如何抓取Android7.0以上的Https包-中篇

1.简介 上一篇中&#xff0c;讲解和分享了一些如何快速解决的临时应急的的方法&#xff0c;但是小伙伴或者童鞋们是不是觉得是一些头痛医头脚痛医脚的方法&#xff0c;治标不治本&#xff0c;或者是一些对于测试人员实现起来比较有一定难度。所以今天宏哥再介绍和分享一下治本…

长相思·罚站墙Vue

优化前 看效果图 Vue长相思 刚学Vue&#xff0c;正好在追剧&#xff0c;看到这个小案例觉得挺好玩的&#xff0c;第一天学&#xff0c;代码太简陋了 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta…

海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码

海外版金融理财系统源码 国际投资理财系统源码 项目投资理财源码

RF手机天线仿真介绍(三):调谐开关分析

目录 简介调谐开关RON、COFF的影响分析不同位置的调谐器件coff影响分析不同位置的调谐器件Ron影响分析Coff引起谐振的解决示例 调谐开关VPEAK分析调谐开关Vpeak示例 简介 孔径调谐能调节天线的电长度&#xff0c;可将其谐振点切换到所需支持的工作频段。天线孔径调谐器通过改变…

GPS/北斗RTK差分定位系统的原理以及应用领域

导语&#xff1a;现代定位技术在国内外的发展与应用越来越广泛&#xff0c;其中GPS和北斗是两大被广泛使用的全球卫星定位系统。本文将介绍GPS/北斗RTK差分定位系统的原理以及其在各个领域的应用。 一、GPS/北斗RTK差分定位系统的原理 GPS/北斗RTK差分定位系统&#xff0c;即全…