目录

一、背景

1.1 为什么使用数据库版本控制工具?

1.2 liquibase和flyway

二、快速开始

2.1 flyway基础

2.2 通过maven使用flyway

2.3 项目结构

2.4 maven集成flyway

2.5 使用Spring和flyway自动初始化数据库

2.6 配置相关的application.yml参数

2.6.1 flyway参数说明


​​​​​​​​​​​​​​

官方文档:https://flywaydb.org/documentation/​​​​​​​

本文项目代码仓库:https://github.com/Rudy0530/readinglist

一、背景

1.1 为什么使用数据库版本控制工具?

作为开发人员,代码版本控制已经属于标配了,但是很多团队还不会把数据库schema纳入版本控制。在开发期间,schema随着需求变化,而这些变化难以追踪记录,从而导致开发人员之间,以及各个环境下的数据库schema的一致性问题。

引入数据库schema版本管理,是期望模仿代码版本控制,把schema的所有版本记录下来,并且可以自动地把数据库升级到最新版本。

1.2 liquibase和flyway

liquibase和flyway都是数据库schema版本管理工具。liquibase提供了更强大的功能,比如多数据库支持,rollback等。而flyway没有引入过多的概念,使用更为简单。在够用的情况下,使用flyway学习成本更低。

二、快速开始

2.1 flyway基础

flyway要求为每一次数据库schema变更创建一个sql语句,以VN(双下划线)作为前缀(比如V1__create_table_A.sql, V2__create_index_on_field_1。)

2.2 通过maven使用flyway

flyway支持命令行,java api,maven,gradle等各种方式调用。我接触的项目使用maven进行管理,所以选择了通过maven使用flyway的方式。

2.3 项目结构

下面是在标准的maven文件夹结构中,增加了/src/resources/db/migration,用于存放数据库脚本。

2.4 maven集成flyway

把以下节点放入pom.xml。flyway需要配置数据库驱动依赖和数据库连接,例子如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.1</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.manning</groupId><artifactId>readinglist</artifactId><version>0.0.1-SNAPSHOT</version><name>readinglist</name><description>reading list demo</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- 使用Spring和flyway自动初始化数据库 --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>7.10.0</version><dependencies><!-- 配置flyway使用的数据库驱动 --><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>7.10.0</version></dependency></dependencies><configuration><!-- 设置sql脚本文件的编码 --><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>

2.5 使用Spring和flyway自动初始化数据库

可以设置在Spring启动的时候,自动检测数据库版本,如果不是最新的,则自动更新。但一般生产环境应该不会使用这种,这种能力,一般应该是在自动化测试里面使用,每次自动化测试前,使用flyway创建一个新的数据库。

首先需要在pom添加flyway-core依赖。

<!-- 测试启动的时候,使用flyway自动初始化数据库。 -->
<dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId>
</dependency>

2.6 配置相关的application.yml参数

spring:datasource:driver-class-name: org.postgresql.Driverusername: postgresurl: jdbc:postgresql://127.0.0.1:5432/rudypassword: 111flyway:url: jdbc:postgresql://127.0.0.1:5432/rudyuser: postgrespassword: 111enabled: truelocations: classpath:db/migrationbaseline-on-migrate: true

2.6.1 flyway参数说明

https://flywaydb.org/documentation/configfiles

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.spring.flyway.cleanDisabled = true # flyway 的 clean 命令会删除指定 schema 下的所有 table, 杀伤力太大了, 应该禁掉.
spring.flyway.enabled = true# 启用或禁用 flyway
spring.flyway.locations =classpath:db/migration# 设定 SQL 脚本的目录,多个路径使用逗号分隔, 比如取值为 classpath:db/migration,filesystem:/sql-migrations
spring.flyway.baselineOnMigrate=true# 如果指定 schema 包含了其他表,但没有 flyway schema history 表的话, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令.# 设置 spring.flyway.baseline-on-migrate 为 true 后, flyway 将在需要 baseline 的时候, 自动执行一次 baseline.
spring.flyway.baselineVersion=1 # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略.
#spring.flyway.encoding=# Encoding of SQL migrations (default: UTF-8)
spring.flyway.table=flyway_schema_history_myapp# 设定 flyway 的 metadata 表名, 缺省为 flyway_schema_history
spring.flyway.outOfOrder=true# 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder .
#spring.flyway.schemas=# 需要 flyway 管控的 schema list, 缺省的话, 使用的时 dbsource.connection直连上的那个 schema, 可以指定多个schema, 但仅会在第一个schema下建立 metadata 表, 也仅在第一个schema应用migration sql 脚本. 但flyway Clean 命令会依次在这些schema下都执行一遍. 

spring项目接入flyway(一) 背景、快速入门相关推荐

  1. Spring Boot 系列(一)快速入门

    简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...

  2. 达达php源码,【达达前端】Ajax实战项目源码讲解(快速入门的实例)Github源码...

    作者 | Jeskson 来源 | 达达前端小酒馆 源码地址: 什么是Ajax技术?实战中的运用ajax技术,了解前后端交互的方式,了解移动端的模式,了解H5的新技术,了解CSS3的使用,和JQuer ...

  3. 最简单的 Java 项目——Hello world(小白快速入门指南)

    文章目录 最简单的 Java 项目--Hello world 步骤1:新建 Java 项目 步骤2:编写最简单的 Hello World 程序 步骤3:测试 附录 1..iml文件(iml是 inte ...

  4. Spring项目接入微信关注/取消关注事件监控(含代码demo,自动回复图文)

    微信官方文档地址:关注/取消关注事件 | 微信开放文档 以上,文档提到:用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL,接下来我们就来看看这个URL怎么配置. [配置步骤]: ...

  5. mybatis学习笔记——mybatis-plus快速入门

    一.快速入门 MyBatis-plus (简称mp)是一款 Mybatis 增强工具,用来简化开发.增强效率.本文结合Spring Boot来实现mp的快速入门. 注:本文演示mp版本为当前最新的3. ...

  6. Markdown: Basics (快速入门)

    声明: 这份文档派生(fork)于繁体中文版,在此基础上进行了繁体转简体工作,并进行了适当的润色.此文档用 Markdown 语法编写,你可以到这里查看它的源文件.「繁体中文版的原始文件可以查看这里」 ...

  7. 究竟什么是Spring Boot,和普通Spring项目有什么区别

    究竟什么是Spring Boot,和普通Spring项目有什么区别 背景 最近我们打算重构设计一个公共包,其中涉及到的一个命题就是公共包要不要引入Spring Boot.那么问题来了究竟什么是Spri ...

  8. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  9. jquery mobile快速入门_【K些项目】学透jquery,11个国内最新项目资料

    对代码.编程感兴趣的可以关注老K玩代码和我交流! " jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaSc ...

  10. spring boot快速入门

    1.什么是SpringBoot 一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置, you can "just run ...

最新文章

  1. Gnome Subtitles:字幕编辑器
  2. 几种常用的图像处理函数库
  3. 纯CSS实现气泡聊天框的方法
  4. java拦截器项目应用_使用拦截器分析Java EE应用程序的性能下降/提高
  5. outlook2010客户端无法预览及保存word,excel问题
  6. 项目中查询数据和模糊查询
  7. flask第七篇——URL与视图函数的映射
  8. asp.net core的TagHelper简单使用
  9. 系统学习机器学习之随机场(二)--MEMM
  10. 【ODBC】ODBC连接数据库详细说明
  11. LVDS的接口电路设计
  12. Swift语言中的@available 和 #available
  13. MCS:连续随机变量——均匀分布和指数分布
  14. hdwiki下model目录功能
  15. Spring Schemas and Namespaces
  16. 内盘外盘新手看热闹,老手在内盘外盘看门道
  17. split使用总结,被坑的正则特殊符号:*/+
  18. android开发查漏补缺图
  19. pycharm出现low memory警告,卡顿
  20. 基于HDF的LED驱动程序开发(2)

热门文章

  1. 【二分答案】JZOJ_3337 wyl8899的TLE
  2. Python3网络爬虫教程7——SSL数字证书
  3. 【一文搞懂】FD_SET的使用
  4. 安装.net补丁后mscorsvw.exe占CPU100%的问题
  5. UnRaid虚拟机添加光驱设备
  6. Linux——MySQL-MMM
  7. 给自己定个小目标:利用python进行数据分析
  8. std::equal 用法
  9. VS code(Visual Studio Code)乱码解决方法
  10. macd底背离的python_python量化交易是否可以有策略有效识别MACD/SKDJ底背离和顶背离?...