SpringBoot 集成数据库迁移工具Flyway

为什么要使用

主要是方便数据库的迁移。
举个栗子:比如我们的代码版本管理仓库使用的是远程Git仓库(例如GitHub),我们在本地搭建了数据库环境,Ok,这样我们在本地可以无忧无虑的coding。但是换一台电脑,且不在同一个网络环境下,这样我们就只能干瞪眼了。例如在公司电脑上下载了源代码后,由于没有对应的数据库表,项目就跑不起来。

Flyway 简介

Flyway 官网
本人就是拿来做数据库迁移工具,可以自己将DDL语句存放在一个个sql脚本文件里,然后项目运行时就会选择性执行脚本。

Spring Boot 使用 Flyway

引入依赖和插件

在maven 工程的pom.xml中添加依赖:

<!--Flyway-->
<dependency>
     <groupId>org.flywaydb</groupId>
     <artifactId>flyway-core</artifactId>
     <version>6.4.4</version>
 </dependency>

然后还是在pom.xml中添加 插件:

<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.2.1</version>
      </plugin>
  </plugins>
</build>

配置Flyway

在 application.yml 文件中配置:

	## flyway数据迁移
spring:
  # 数据源,配置自己的数据库连接配置就好了
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring-security?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    minPoolSize: 3
    maxPoolSize: 10
    maxLifetime: 20000
    borrowConnectionTimeout: 30
    loginTimeout: 30
    mainteanceInterval: 60
    maxIdleTime: 60
  flyway:
    #是否开启
    enabled: true
    locations: classpath:db/migration #迁移脚本的位置,默认db/migration
    baseline-on-migrate: true
    table: flyway_schema_history # 记录历史记录的表名称
    out-of-order: false

创建sql脚本存放目录

根据上一步 application.yml 里配置的 spring.flyway.locations 属性,我们在类路径下(resources目录下)创建一个 db/migration 目录,这个目录就存放我们后续的所有sql脚本文件。
在这里插入图片描述
示例:
在db/migration目录下,创建一个文件.,文件全名是 V1.0.0__init_db.sql,文件内容如下:

文件内容主要是 创建三个表:sys_usersys_rolesys_user_role,并给三张表添加一点额外数据。

CREATE TABLE `sys_user`
(
    `id`       int(11)      NOT NULL AUTO_INCREMENT,
    `name`     varchar(255) NOT NULL,
    `password` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE `sys_role`
(
    `id`   int(11)      NOT NULL,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

CREATE TABLE `sys_user_role`
(
    `user_id` int(11) NOT NULL,
    `role_id` int(11) NOT NULL,
    PRIMARY KEY (`user_id`, `role_id`),
    KEY `fk_role_id` (`role_id`),
    CONSTRAINT `fk_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = utf8;

#  初始数据
INSERT INTO `sys_role` VALUES ('1', 'ROLE_ADMIN');
INSERT INTO `sys_role` VALUES ('2', 'ROLE_USER');

INSERT INTO `sys_user` VALUES ('1', 'admin', '123');
INSERT INTO `sys_user` VALUES ('2', 'jitwxs', '123');

INSERT INTO `sys_user_role` VALUES ('1', '1');
INSERT INTO `sys_user_role` VALUES ('2', '2');

注意

我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本。

  • V 字开头的脚本只会执行一次(脚本文件格式:V1.0.0__init.sql)。
  • R 字开头的脚本,只要脚本内容发生了变化,启动时候就会执行(脚本文件格式:R__init.sql 没有版本的概念)。
  • 所有的脚本,一旦执行了,就会在 flyway_schema_history 表中有记录,如果你不小心搞错了,可以手动从 flyway_schema_history 表中删除记录,然后修改 SQL 脚本后再重新启动(生产环境不建议)。

启动项目,验证

前提是,数据库一定要存在
项目启动日志:
在这里插入图片描述
再来看数据库:
在这里插入图片描述
我们再看看 flyway_schema_history 表:

sql 脚本执行记录表
在这里插入图片描述

好了,这样一个简单的Flyway简单的例子就完成了。

Flyway的其它配置属性

spring:
  flyway:
    baseline-description: #执行基线时标记已有Schema的描述。
    baseline-on-migrate: false # 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。(默认值:false。)
    baseline-version: 1 #执行基线时用来标记已有Schema的版本。 (默认值:1。)
    check-location: false #检查迁移脚本所在的位置是否存在。 (默认值: false 。 )
    clean-on-validation-error: false #在验证错误时,是否自动执行清理。 (默认值: false 。 )
    enabled: true #开启Flyway。 (默认值: true 。 )
    encoding: UTF-8 #设置SQL迁移文件的编码。 (默认值: UTF-8 。 )
    ignore-failed-future-migration: false #在读元数据表时,是否忽略失败的后续迁移。 (默认值: false 。 )
    init-sqls: #获取连接后立即执行初始化的SQL语句。
    locations: classpath:db/migration #迁移脚本的位置。 (默认值: db/migration 。 )
    out-of-order: false #是否允许乱序(out of order)迁移。 (默认值: false 。 )
    password: #待迁移数据库的登录密码
    placeholder-prefix: #设置每个占位符的前缀。 (默认值: ${ 。 )
    placeholder-replacement: #是否要替换占位符。 (默认值: true 。 )
    flyway.placeholder-suffix: #设置占位符的后缀。 (默认值: } 。 )
    placeholders: [placeholder name] #设置占位符的值。
    schemas: #Flyway管理的Schema列表,区分大小写。默认连接对应的默认Schema。
    sql-migration-prefix: V #SQL迁移的文件名前缀。 (默认值: V 。 )
    sql-migration-separator: __ #SQL迁移的文件名分隔符。 (默认值: __ 。 )
    sql-migration-suffix: .sql #SQL迁移的文件名后缀。 (默认值: .sql 。 )
    table: #Flyway使用的Schema元数据表名称。 (默认值: schema_version 。 )
    target: #Flyway要迁移到的目标版本号。 (默认最新版本。 )
    url: #待迁移的数据库的JDBC URL。如果没有设置,就使用配置的主数据源。
    user: #待迁移数据库的登录用户。
    validate-on-migrate: true #在运行迁移时是否要自动验证。 (默认值: true 。 )

注意

Flyway将每一个数据库脚本称之为:migrations,flyway支持三种类型的migration:

  • Versioned migrations:最常用的migration,可以简单的理解为数据库升级脚本
  • Undo migrations:数据库版本回退脚本,需要Pro版本,忽略,而且使用过程存在较大风险,undo操作目前只能通过plugin或者command-line来执行
  • Repeatable migrations:可重复执行的migration,例如create or replace脚本,当脚本checksums改变时会重新执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值