Flyway——配置和使用(入门)

介绍

Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话来讲,Flyway 可以实现开发者 Git 管理不同人的代码那样,管理不同人的SQL脚本,从而做到数据库同步。

测试环境

  • Springboot 2.X
  • 数据库:MySQL
  • flyway:5.2.4

依赖引入

按照上面测试的要求,需要对MySQL数据库进行测试,所以需要使用下列依赖信息:

  • springboot主依赖版本:
<parent>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
  • 数据库连接、flyway依赖:
<dependencies>
   <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.20</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
        <version>5.2.4</version>
    </dependency>

</dependencies>

【额外注意:】必须增加数据库连接pom依赖!

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

否则会出现项目启动成功,但不会自动生成表的问题!

配置数据库连接

本次采取Springboot,只需要在application.yml中配置对应的数据库连接即可。

server:
  port: 80
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://106.55.137.66:3306/flyway?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
    driver-class-name: com.mysql.cj.jdbc.Driver # mysql8的驱动,注意时区,如果是使用 MySQL 8 之前的驱动,可以是 com.mysql.jdbc.Driver

  flyway:
    locations: classpath:db/migration # 默认配置
    enabled: true # 默认
    baseline-on-migrate: true
    clean-on-validation-error: false

启动类

启动类,只需要保证是Springboot应用即可:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class StartApplication {
    public static void main(String[] args) {
        try {
            SpringApplication.run(StartApplication.class,args);
        }catch (Exception e){
            System.out.println(e);
        }
    }
}

设置脚本

首先需要在classpath目录下,创建一个名为db.migration的文件夹。

然后向该文件夹内,增加SQL脚本。编写SQL脚本需要注意以下几点:

  • 1、仅需要执行一次的脚本,以V开头,后面跟上0~9的数字组合,数字之间可以使用.或者_进行分割。然后再以两个下划线 __进行分割,其后跟上文件名称,最后以.sql结尾。

    如: V1__create_user_ddl.sqlV2__create_user.sql

  • 2、需要重复执行的SQL,则需要以R开头。后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。

    如:R__truncate_user_dml.sql

编写如下所示的测试脚本V1__create_user.sql信息,如下所示:

CREATE TABLE IF NOT EXISTS `USER`(
     `USER_ID`          INT(11)           NOT NULL AUTO_INCREMENT,
     `USER_NAME`        VARCHAR(100)      NOT NULL COMMENT '用户姓名',
     `AGE`              INT(3)            NOT NULL COMMENT '年龄',
     `CREATED_TIME`     datetime          NOT NULL DEFAULT CURRENT_TIMESTAMP,
     `CREATED_BY`       varchar(100)      NOT NULL DEFAULT 'UNKNOWN',
     `UPDATED_TIME`     datetime          NOT NULL DEFAULT CURRENT_TIMESTAMP,
     `UPDATED_BY`       varchar(100)      NOT NULL DEFAULT 'UNKNOWN',
     PRIMARY KEY (`USER_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

项目结构概览

最初创建好数据库名后,此时数据库中的信息如下所示:
在这里插入图片描述
项目结构如下所示:
在这里插入图片描述

项目启动,观察日志和数据库结果

在这里插入图片描述
观察对应数据库结构信息,刷新数据库:
在这里插入图片描述
会出现两个表信息!
【疑问】为什么会出现两张表?

flyway_schema_history是一个flyway管理各个版本关系的表,主要用于维护和管理开发者本地的脚本版本信息。
在这里插入图片描述

另一张表,则是刚刚的SQL脚本执行结果表,如下所示:
在这里插入图片描述

测试R开头的脚本

classpath文件夹中,新增一个R__add_user_info.sql的脚本信息,其中SQL脚本如下所示:

insert into `user`(user_name,age) values('unknown',33);

重启项目,观察结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【注意】这里的 R 重复执行脚本,并不是说是启动项目后不断执行!

而是,每次启动项目,都会重新校验对应的 R__add_user_info.sql 内容是否变更,如果变更则重新执行

直接重启项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改 R__add_user_info.sql 后重启

修改R__add_user_info.sql中的信息,重新启动项目:

-- insert into `user`(user_name,age) values('unknown',33);

insert into `user`(user_name,age) values('xiangjiao',22);

重启项目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

变更数据库字段

正常开发中,字段信息的变更,往往不是很常见,这个要看需求。

如果因为需求的出现,导致需要在数据库表中增加或修改字段信息,此时flyway能轻松胜任。

之前的SQL脚本中,只设定有用户名、性别等信息,但如果想增加一个密码字段,此时则需要新增一个脚本。

V2__add_user_pwd.sql,其中脚本内容如下所示:

ALTER TABLE `user` add column user_pwd varchar(11) default null comment '密码' after `age`;

user表中增加字段user_pwd,设定类型为varchar(11),默认为null
并要求在 age 字段 之后

在这里插入图片描述
重启项目,查看结果信息:
在这里插入图片描述
在这里插入图片描述
【批注:】这里居然插入到了最后 !!!

验证 V 只能执行一次的问题

之前说到,如果是需要可重复执行,需要使用R开头,编写SQL脚本。

但是如果在已运行成功的项目中,修改V开头的脚本,再重新启动脚本会咋样?

原脚本信息为:
在这里插入图片描述
接下来向其中再加一个字段,注意这里是V开头的脚本!
在这里插入图片描述

ALTER TABLE `user` add column user_position varchar(11) default null comment '位置';

重启项目,观察现象:
在这里插入图片描述
从控制台日志信息可以看出:

V开头的脚本文件,在项目启动时,会去flyway_schema_history表中匹配判断!
如果文本信息不匹配,则直接报错!!!!

验证 R 可执行多次

将之前修改的V文件还原,这次修改R文件。

原文件信息为:
在这里插入图片描述
在其中新增一条数据信息:
在这里插入图片描述
重启项目,观察结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
R文件变更后,启动并不会报错!

1、启动后,会判断R文件的内容信息是否发生变更。
2、如果未变更,则不会新增数据!
3、如果存在变更,则会将脚本再执行一遍

验证只有一个_会报错

当增加脚本文件,但命名为V3_add_user_pwd.sql

注意:当前V后只有一个_

在这里插入图片描述

insert into `user`(user_name,age) values('xiangjiao222',333);

当应用启动,则会出现如下所示的报错信息:
在这里插入图片描述

技能扩充

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

参考资料

Flyway快速上手教程
mysql在表的某一位置增加一列、删除一列、修改列名

代码下载

gitee 仓库项目地址

  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值