GVKun编程网logo

SpringBoot整合数据库版本管理工具flyway(入门)(springboot整合springdatajpa)

21

本文的目的是介绍SpringBoot整合数据库版本管理工具flyway的详细情况,特别关注入门的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解SpringBoot整合

本文的目的是介绍SpringBoot整合数据库版本管理工具flyway的详细情况,特别关注入门的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解SpringBoot整合数据库版本管理工具flyway的机会,同时也不会遗漏关于Flyway 一个方便集成的数据库版本管理工具、Flyway让数据库版本管理更简单、Flyway详解以及Springboot集成Flyway(转)、Flyway:Spring Boot 中使用 Flyway 来管理数据库版本的知识。

本文目录一览:

SpringBoot整合数据库版本管理工具flyway(入门)(springboot整合springdatajpa)

SpringBoot整合数据库版本管理工具flyway(入门)(springboot整合springdatajpa)

 代码Demo地址:https://github.com/shileishmily/spring-boot-jooq-demo.git

Flyway是什么

Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。

如果你和我一样,有开发环境,测试环境,RC环境,生产环境,还有为某些渠道商户定制搭建的环境。那么哪怕是增加一个字段,你都必须在各个环境执行一遍。如何改动较大,

比如某一个开发版本增加了10张表,修改了N表的注释,字段长度等等等等。想想头就大了,就算天天想,时时想。最后上生产环境还是会有遗漏。

 

现在有了flyway,一切变得轻松。

 

1、添加gradle依赖

buildscript {
    ext {
        springBootVersion = ''1.5.9.RELEASE''
    }
    repositories {
        maven { url ''http://maven.aliyun.com/nexus/content/groups/public/'' }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.flywaydb:flyway-gradle-plugin:5.0.7")

    }
}

apply plugin: ''java''
apply plugin: ''idea''
apply plugin: ''org.flywaydb.flyway''
apply plugin: ''org.springframework.boot''


dependencies {

    compile group: ''org.flywaydb'', name: ''flyway-maven-plugin'', version: ''5.2.4''
    compile group: ''org.flywaydb'', name: ''flyway-core'', version: ''5.0.7''

}

 

2、application.yml配置

spring:
  profiles:
    active: dev
  aop:
    auto: true
    proxy-target-class: true
  datasource:
    url: jdbc:mysql://localhost:3306/jooq_test?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    username: root
    password: 111
    driver-class-name: com.mysql.jdbc.Driver
  jooq:
    sql-dialect: mysql
  flyway:
    clean-disabled: true #禁用clean操作
    enabled: true #使flyway生效
    baseline-on-migrate: true #初始化时如果不存在迁移记录表,默认新建一个
    out-of-order: true #防止开发环境下漏掉没来得及apply的文件,产品环境最好设为false
    locations: classpath:/db/migration

 

3、/db/migration/V1__init_database.sql文件,新增一张表sys_log

CREATE TABLE `sys_log` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `ip_address` varchar(50) DEFAULT NULL COMMENT ''ip地址'',
   `oper_id` int(11) DEFAULT NULL COMMENT ''操作人ID'',
   `user_name` varchar(50) DEFAULT NULL COMMENT ''用户名'',
   `module_name` varchar(50) DEFAULT NULL COMMENT ''模块名称'',
   `method_name` varchar(50) DEFAULT NULL COMMENT ''方法名'',
   `method_desc` varchar(100) DEFAULT NULL COMMENT ''方法描述'',
   `oper_content` varchar(6000) DEFAULT NULL COMMENT ''操作内容'',
   `create_time` datetime DEFAULT NULL COMMENT ''创建时间'',
   `app_id` int(11) DEFAULT NULL COMMENT ''应用ID'',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

4、首次执行需要在数据库实例jooq_test创建表flyway_schema_history,flyway_schema_history是flyway版本控制记录表,必须要创建。

CREATE TABLE `flyway_schema_history` (
  `installed_rank` int(11) NOT NULL,
  `version` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `type` varchar(20) NOT NULL,
  `script` varchar(1000) NOT NULL,
  `checksum` int(11) DEFAULT NULL,
  `installed_by` varchar(100) NOT NULL,
  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `execution_time` int(11) NOT NULL,
  `success` tinyint(1) NOT NULL,
  PRIMARY KEY (`installed_rank`),
  KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

5、启动SpringBoot程序JooqApplication,启动时会自动执行数据库脚本文件。

package com.suixingpay.jooq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = {"com.suixingpay.jooq"})
public class JooqApplication {

    public static void main(String[] args) {
        SpringApplication.run(JooqApplication.class, args);
    }
}

 

6、登录数据库查询发现多了两张表

sys_log是我们在V1__init_database.sql中新增的表;

flyway_schema_history是flyway版本控制记录表;

查询表flyway_schema_history,可以看到刚才执行V1__init_database.sql脚本的记录已经有了。

 

代码Demo地址:https://github.com/shileishmily/spring-boot-jooq-demo.git

Flyway 一个方便集成的数据库版本管理工具

Flyway 一个方便集成的数据库版本管理工具

首先把官方的特性贴出来, 简明意概:

Flyway 的特性

* 自动升级(自动发现更新项):Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行,可以通过Ant 脚本执行,通过Maven 脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如在应用启动时执行)。

* 规约优于配置:Flyway 有一套默认的规约,所以不需要修改任何配置就可以正常使用。

* 既支持SQL 脚本,又支持Java 代码:可以使用SQL 脚本执行数据库更新,也可以使用Java 代码来进行一些高级数据升级操作。

        * 高可靠性:在集群环境下进行数据库升级是安全可靠的。

* 支持清除已存在的库表结构:Flyway 可以清除已存在的库表结构,可以从零开始搭建您的库表结构,并管理您的数据库版本升级工作。

* 支持失败修复。新的2.0 版本提供了repair 功能,用于解决数据库更新操作失败问题

简单说, 上面的特性不难理解,flyway 是通过版本号来控制自动升级的功能,通过约定来默认实现配置,通过SQL 脚本实现数据库更新控制。SQ脚本和JAVA代码本身不和平台有关,故可实现高可用。通过约定的版本号控制SQL脚本的执行,则可以清除已存在的库表结构。 

我个人比较倾向不和JAVA相关联,将Flyway 视为一种运维的工具, 故更推荐使用SQL脚本。

以下是官方的目录结构:

比较清晰,只要对应申明 目录结构即可。不一定要放在 migration 下面。 

我个人常用gradle 做打包和集成工具,故这里写一下简单的flyway在gradle 中的应用方式。

首先在build.gradle中,引入flyway 插件(插件开发比较容易,会一点groovy 就行了。这里具体不展开)

官方引入方式:

plugins {
    id "org.flywaydb.flyway" version "4.0"}

我比较常用的引入方式:

apply plugin: ''org.flywaydb.flyway''
//配置插件仓库
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.flywaydb:flyway-gradle-plugin:3.2.1"
    }

}

随后就是在build.gradle里面声明 flyway 参数了

ext{

    def prop = new Properties();
    file(" src/main/resources/jdbc -mysql.properties").withInputStream {
        prop.load(it)
    }
    prop.each {
        project.extensions.add("$it.key",it.value);

    }
}

flyway {
    user = project[''jdbc.user'']
    url= project[''jdbc.url'']
    password = project[''jdbc.pass'']
    locations=["filesystem:db/migration"]
}

比较倾向以上的读取方式,使用单独的 配置文件,管理数据库的配置。 

最后整理一下SQL的命名方式即可:

1。版本集成:

     前缀用V,随后跟随 版本号, 版本号之间用 单一下划线表示。 后面跟随2个下划线,后面跟随具体的描述。最后是后缀

2。可重复的集成 :

     前缀用R,随后跟随2个下划线,后面跟随具体的描述,最后是后缀

注意起步的版本号是 从1_0_0 开始的,故SQL脚本编码可以写1_0_1开始。

最后就是执行了,

首先执行 flywayBaseline 在数据库中建立 schema_version表,建立基础的版本信息,随后 执行 flywayMigrate 进行数据库脚本执行。

贴一下具体的tasks:

  • flywayMigrate:应用所有的迁移到最新版本,它会在你的DB中新建个表schema_version来存放每次升级的版本信息。

  • flywayClean:clean all objects

  • flywayInfo:打印所有的迁移的信息以及状态。

  • flywayValidate:迁移之前进行验证。

  • flywayBaseline:初始化schema_version表,并插入一条原始verion=1。

  • flywayRepair:它主要做了两件事,移除所有失败的迁移(升级),重置校验和。


第一个OSChina 的文章写完了,没有花多少时间, 但觉得还是挺满足的。











Flyway让数据库版本管理更简单

Flyway让数据库版本管理更简单

Flyway是什么

随着项目CICD接入,一键启动,敏捷开发已经成为降本提效的不二法宝,其中涉及SQL的变更还不够智能和自动化,因此亟需一款工具能够帮助开发及运维人员高效简便地完成SQL变更,Flyway正是可以满足我们需求的一款工具。

当我们打开Flyway的官网,在首页可以看到关于Flyway的一段英文介绍:

 title=

Flyway是数据库的版本控制,跨所有环境的稳健架构演变。轻松、愉快和简单的SQL。

 title=

总的来说,Flyway是一款专为CI/CD打造的,能对数据库变更做版本控制的工具。

Flyway支持的数据库很多,主流的数据库都能够完美支持,官网摘抄如下:

Supported databases are Oracle, SQL Server (including Amazon RDS and Azure SQL Database), Azure Synapse

(Formerly Data Warehouse), DB2, MySQL (including Amazon RDS, Azure Database & Google Cloud SQL), Aurora MySQL,

MariaDB, Percona XtraDB Cluster, TestContainers, PostgreSQL (including Amazon RDS, Azure Database, Google Cloud

SQL, TimescaleDB, YugabyteDB & Heroku), Aurora PostgreSQL, Redshift, CockroachDB, SAP HANA, Sybase ASE,

Informix, H2, HSQLDB, Derby, Snowflake, SQLite and Firebird.

Flyway解决的问题

在项目或产品研发过程中,很难一开始就把业务理清楚,把代码逻辑和数据库表设计好,因此代码和数据表也会在迭代周期内不断迭代。我们都习惯使用SVN或者Git来对代码进行版本管理,主要是为了解决多人开发代码冲突和版本回退的问题。

其实,数据库的变更也需要版本控制,在日常开发和环境部署中,我们经常会遇到下面的问题:

  • 在开发环境部署程序发现报错,定位是自己写的SQL脚本忘了在当前环境执行导致;
  • 从Git上新down下来的代码运行报错,定位发现是其他同事修改了的SQL脚本没有在当前环境执行导致;
  • 每次发布包都需要发布SQL文件包和应用程序的版本包;
  • 线上环境部署报错,发现是运维没有按照你投产文档里面说明的SQL脚本执行顺序操作执行导致;
  • 流水线可以自动化部署程序,但是SQL脚本还是需要手动执行或者流水线执行SQL脚本配置比较繁琐;
  • 其他场景....

有了Flyway,这些问题都可以轻松的解决。Flyway可以对数据库进行版本管理,可以自动执行SQL,能快速有效地用于迭代数据库表结构,并保证部署到测试环境或生产环境时,数据表都是保持一致的;

Flyway主要工作流程

Flyway工作流程如下:

 title=

1、项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。

2、初次使用时,Flyway会创建一个flyway_schema_history表,用于记录sql执行记录。

3、Flyway会扫描项目指定路径下(默认是classpath:db/migration)的所有sql脚本,与flyway_schema_history表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,Flyway会报错并停止项目执行。

4、如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。

在SpringBoot项目使用Flyway

Flyway既支持使用客户端command-lineclient命令行方式也支持JAVA API方式升级数据库,本文只介绍JAVA API以Maven引入插件方式的使用,更多方式可以查看官网;

引入依赖

在start.spring.io上新建一个SpringBoot工程,引入数据库驱动依赖等,同时引入Flyway的依赖,这个步骤比较简单,不做过多说明(本文示例使用的是Mysql数据库);

<dependency>

    <groupId>org.flywaydb</groupId>

    <artifactId>flyway-core</artifactId>

    <version>7.14.0</version><!-- 截至发稿前,官网最新版本是7.14.0 -->

</dependency>

添加Flyway配置

spring:

  # 数据库连接配置

  datasource:

    driver-class-name: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://localhost:3306/xukj_flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

    username: flyway

    password: xxx

  flyway:

    # 是否启用flyway

    enabled: true

       # 编码格式,默认UTF-8

    encoding: UTF-8

    # 迁移sql脚本文件存放路径,默认db/migration

    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表

    baseline-on-migrate: true

创建SQL脚本

项目创建以后,在src/resources下有 db/migration(或db.migration)目录,在其中创建对应的SQL文件,基于约定由于配置的原则,不同的类型通过文件命名方式进行区分

 title=

Flyway对数据库的所有更改都称为迁移;版本迁移(Versioned Migrations)以V开头,只会执行一次;回退迁移(Undo Migrations)以U开头,执行一旦发生破坏性更改,就会很麻烦,项目中一般不用;可重复执行迁移(Repeatable Migrations)以R开头,每次修改后都会重新执行。

总结如下:

  1. 仅需要被执行一次的SQL命名以大写的"V"开头,后面跟上"0~9"数字的组合,数字之间可以用“.”或者下划线"_"分割开,然后再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,V2020.00.000_1__create_table.sql,V202001.00.000_2__insertTable.sql,V2.1.5__create_table.sql。
  2. 可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,R__addTable.sql,R__update_user.sql。
  3. 版本号需要唯一,否则Flyway执行会报错;如果V__脚本.sql,已经执行过了,不能修改里面的内容,再次执行Flyway就会报错。R——脚本.sql,如有变化可以执行多次。
  4. V开头的SQL执行优先级要比R开头的SQL优先级高。

如下,我们准备了三个脚本,分别为:

1、V2020.00.000_1__create_table.sql,代码如下,目的是创建一张表,且只执行一次

CREATE TABLE `test_flyway_table` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''主键'',

  `time` datetime NOT NULL COMMENT ''创建时间'',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2、V202001.00.000_2__insertTable.sql,代码如下,目的是往表中插入一条数据,且只执行一次

INSERT INTO `test_flyway_table` VALUES (''1'', ''2021-06-28 17:48:48'');

3、R__addTable.sql,代码如下,目的是每次启动如果有变化,则执行一次

update `test_flyway_table` set time = ''2021-08-23 17:48:48'' where id =1;

对应目录截图如下:

 title=

运行

按照上面配置完成,已经足够我们开始运行了,此时,我们第一次启动项目,如果配置没有错误,运行截图如下:

 title=

此时,我们刷新数据库,可以看到Flyway的历史记录表已经生成并插入了三个版本的记录:

 title=

而且,表也已经创建好了并有一条数据:

 title=

此时不做任何改变,重启程序,日志如下:

 title=

日志显示表没有变化,不做变更,查看两张表的内容也无变化。

如果我们修改V202001.00.000_2__insertTable.sql脚本,重启程序,就会报错,提示信息如下:

Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation

Migration checksum mismatch for migration version 202001.00.000.2

-> Applied to database : 1190158040

-> Resolved locally: 843339817. Either revert the changes to the migration, or run repair to update the schema history.

如果我们修改R__addTable.sql脚本,重启程序,脚本会再次执行,并且Flyway的历史记录表也会增加本次执行的记录。

Flyway的执行效率

为了验证Flyway项目数据库迭代了较久时间,积累了几百个Sql以后是否会拖慢项目的启动速度?进行了一个对照组试验:

场景(sql文件控制在10K以内)执行平均时长(单位:秒)
放1个已经被执行过的SQL脚本,反复启动项目11.1
放25个已经被执行过的SQL脚本,反复启动项目11.4
放50个已经被执行过的SQL脚本,反复启动项目11.6
放100个已经被执行过的SQL脚本,反复启动项目12.19

脚本在历史记录表中有记录,即使有几百条SQL脚本,每次项目启动只执行单次迭代的脚本,所以耗时主要来源于两个方面:

  • Flyway依次读取脚本中内容时的IO开销;
  • Flyway计算脚本checksum值的算法开销;

对于IO开销而言,每个脚本如果不是涉及大量的数据变更,只是表结构的变更,脚本的大小都非常小,可以不考虑.事实上Flyway也不适合大量的数据变更时使用,因此IO开销对启动耗时的增量基本可以忽略

Flyway计算checksum值采用的是著名的CRC32(循环冗余校验码)算法,该算法是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。为了验证算法计算效率,做了如下试验:

场景执行平均时长(单位:毫秒)
读取一个超大文件,约1M,并进行计算,反复执行多次48
读取一个正常大小的SQL脚本,约10K,并进行计算,反复执行多次4

由此可见,即便是有上百个正常大小的sql,计算checksum值也不会耗费太多的时间,基本都可以在1秒内完成,所以接入Flyway后也不必担心会有历史包袱。

Flyway详解以及Springboot集成Flyway(转)

Flyway详解以及Springboot集成Flyway(转)

Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里;不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复。

Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;

sql脚本的格式:V+版本号 +双下划线+秒速+结束符 

例如:V1__INIT_DATABASE.sql

上面的V 是默认值, 可以通过

flyway.sql-migration-prefix来指定前缀 ,
 

Migrate:

Migrate是指把数据Schema迁移到最新版本,在Migrate时会检查MetaData元数据表,如果不存在就创建MetaData表,MetaData用于记录数据库历史变更等信息;

Migrate会扫描指定文件系统或者classpath下的Migrations。会与MetaData中的记录进行对比,进行版本升级;

 

Clean:清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用;

 

Info:用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本;

 

validate:验证以及apply的Migrations是否有变更,默认开启的;原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败。

 

BaseLine:对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以应用到已有表结构的数据库中也可以实现添加Metadata表。

repair:repair操作能够修复metaData表,该操作在metadata出现错误时很有用

用途:

  1):移除失败的Migration记录,只针对不支持DDL事务的数据库

  

使用Flayway:

1、引入flyway的依赖:

<dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>5.0.3</version>
</dependency>
<plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>5.0.3</version>
</plugin>

2、新建一个maven的Springboot项目,在配置文件中配置数据源信息:

server.port=8088
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3、在classpath下新建/db/migration文件夹,并创建sql脚本文件:

use testdb;
 
CREATE TABLE person (
  id int(11) NOT NULL AUTO_INCREMENT,
  first varchar(100) NOT NULL,
  last varchar(100) NOT NULL,
  dateofbirth DATE DEFAULT null,
  placeofbirth varchar(100) not null,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
insert into person (first,last,dateofbirth,placeofbirth) values(''Dursun'',''KOC'', STR_TO_DATE(''02/10/1982'', ''%m/%d/%Y''),''Erzincan'');
 
 
 
insert into person (first,last,dateofbirth,placeofbirth) values(''Durseeun'',''KeeOC'', STR_TO_DATE(''05/10/1982'', ''%m/%d/%Y''),''Erzeeincan'');

4、启动springboot项目:

 

 

加载了sql脚本 。

5、查看数据库:

生成了flyway-schema-history表,这个版本默认是这个表,如果想自己指定schema表的命,可以设置:

flyway.tableflyway

6: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.

————————————————
版权声明:本文为CSDN博主「Jennire_Q」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qiuhao9527/article/details/81070482

 

Flyway:Spring Boot 中使用 Flyway 来管理数据库版本

Flyway:Spring Boot 中使用 Flyway 来管理数据库版本

Flyway 简介

Flyway 是一个简单开源数据库版本控制器(约定大于配置),主要提供 migrate、clean、info、validate、baseline、repair 等命令。它支持 SQL(PL/SQL、T-SQL)方式和 Java 方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT 等)。

官方网站:https://flywaydb.org/

 

下面我们可以通过对使用 JdbcTemplate 一文中的例子进行加工完成。读者也可以拿任何一个与数据访问相关的工程来做如下内容的实验:

  • 第一步,在 pom.xml 中增加 flyway 的依赖:

 

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>5.0.3</version>
</dependency>
  • 第二步,按 Flyway 的规范创建版本化的 SQL 脚本。

 

    • 在工程的 src/main/resources 目录下创建 db 目录
    • db 目录下创建版本化的 SQL 脚本 V1__Base_version.sql

 

DROP TABLE IF EXISTS user ;
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ''主键'',
  `name` varchar(20) NOT NULL COMMENT ''姓名'',
  `age` int(5) DEFAULT NULL COMMENT ''年龄'',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

  • 第三步,在 application.properties 文件中配置 Flyway 要加载的 SQL 脚本位置。按第二步创建的结果配置如下:
flyway.locations=classpath:/db
flyway.baselineOnMigrate=true
flyway.enabled=false
  • 第四步,执行单元测试 ApplicationTests,此时我们在日志中可以看到如下信息:
INFO 82441 --- [main] o.f.core.internal.util.VersionPrinter    : Flyway Community Edition 5.0.3 by Boxfuse
INFO 82441 --- [main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
INFO 82441 --- [main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.022s)
INFO 82441 --- [main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: `test`.`flyway_schema_history`
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate      : Current version of schema `test`: << Empty Schema >>
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate      : Migrating schema `test` to version 1 - Base version
WARN 82441 --- [main] o.f.core.internal.sqlscript.SqlScript    : DB: Unknown table ''test.user'' (SQL State: 42S02 - Error Code: 1051)
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema `test` (execution time 00:00.128s)

Flyway 监测到需要运行版本脚本来初始化数据库,因此执行了 V1__Base_version.sql 脚本,从而创建了 user 表,这才得以让一系列单元测试(对 user 表的 CRUD 操作)通过。

  • 第五步,我们可以继续再执行一下单元测试,此时我们会发现日志输出与之前不同:
    INFO 83150 --- [main] o.f.core.internal.util.VersionPrinter    : Flyway Community Edition 5.0.3 by Boxfuse
    INFO 83150 --- [main] o.f.c.internal.database.DatabaseFactory  : Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
    INFO 83150 --- [main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.031s)
    INFO 83150 --- [main] o.f.core.internal.command.DbMigrate      : Current version of schema `test`: 1
    INFO 83150 --- [main] o.f.core.internal.command.DbMigrate      : Schema `test` is up to date. No migration necessary.

    由于在第四步的时候,初始化脚本已经执行过,所以这次执行就没有再去执行 V1__Base_version.sql 脚本来重建 user 表。

  • 第六步,我们可以尝试修改一下 V1__Base_version.sql 脚本中的 name 字段长度,然后在运行一下单元测试,此时我们可以得到如下错误:
    ERROR 83791 --- [main] o.s.boot.SpringApplication               : Application startup failed
    
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''flywayInitializer'' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1
    -> Applied to database : 466264992
    -> Resolved locally    : -270269434

    由于初始化脚本的改动,Flyway 校验失败,认为当前的 V1__Base_version.sql 脚本与上一次执行的内容不同,提示报错并终止程序,以免造成更严重的数据结构破坏。

文章转载至:http://blog.didispace.com/spring-boot-flyway-db-version/

关于SpringBoot整合数据库版本管理工具flyway入门的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Flyway 一个方便集成的数据库版本管理工具、Flyway让数据库版本管理更简单、Flyway详解以及Springboot集成Flyway(转)、Flyway:Spring Boot 中使用 Flyway 来管理数据库版本等相关内容,可以在本站寻找。

本文标签: