springboot+flyway使用

  • Post author:
  • Post category:其他




github地址


https://github.com/yanjingfan/sakura-boot-demo/tree/master/web



flyway

用途:初始化数据库,支持数据库脚本的版本管理

第一步:springboot已经集成了flyway,加入依赖时并不需要添加版本号

<!-- 添加 flyway 的依赖开始 -->
<dependency>
   <groupId>org.flywaydb</groupId>
   <artifactId>flyway-core</artifactId>
</dependency>

<!-- flyway使用jdbc依赖包初始化数据库 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 添加 flyway 的依赖结束 -->

<!-- MySql数据库连接 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

第二步:在

classpath:db/migration

目录下创建数据库脚本

举例:V1_0_0__init_20210702.sql

#下面的是例子中的表
CREATE TABLE IF NOT EXISTS `t_order`(
    id          BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    create_time DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    edit_time   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    user_id     BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
    order_id    VARCHAR(64)     NOT NULL COMMENT '订单ID',
    amount      DECIMAL(12, 2)  NOT NULL DEFAULT 0 COMMENT '订单金额',
    INDEX idx_user_id (user_id),
    UNIQUE uniq_order_id (order_id)
) COMMENT '订单表';
  • Flyway 执行的 SQL 脚本必须遵循一种命名规则,

    V<VERSION>__<NAME>.sql

    首先是

    V

    ,然后是版本号,如果版本号有多个数字,使用

    _

    分隔,比如

    1_0_0

    版本号的后面是 2 个下划线,最后是 SQL 脚本的名称。


    这里需要注意:


    • V 开头的只会执行一次,下次项目启动不会执行,也不可以修改原始文件,否则项目启动会报错,如果需要对 V 开头的脚本做修改,如果有个 SQL 脚本需要在每次启动的时候都执行,那么将 V 改为

      R

      开头即可

    • 使用flyway创建表后,就不要再去数据库手动改这张表的结构了,一切表的结构改动都用flyway,否则会影响修改记录,导致项目报错


    • 上述两种情况的解决方案:

      找到

      flyway_schema_history

      表,删除对应的记录即可

第三步:

yml配置

spring:
  flyway:
    enabled: true
    # 迁移前校验 SQL 文件是否存在问题
    validate-on-migrate: true
    # 一定要设置为true,否则会清空数据库
    clean-disabled: true
    # 校验路径下是否存在 SQL 文件
    check-location: false
    # 最开始已经存在表结构,且不存在 flyway_schema_history 表时,需要设置为 true
    baseline-on-migrate: true
    # 基础版本 0
    baseline-version: 0

properties配置

################################ flyway ############################
spring.flyway.enabled=true
# 迁移前校验 SQL 文件是否存在问题
spring.flyway.validate-on-migrate=true
# 生产环境一定要关闭
spring.flyway.clean-disabled=true
# 校验路径下是否存在 SQL 文件
spring.flyway.check-location=false
# 最开始已经存在表结构,且不存在 flyway_schema_history 表时,需要设置为 true
spring.flyway.baseline-on-migrate=true
# 基础版本 0
spring.flyway.baseline-version=0


升级脚本越来越多怎么办

当经历几十个版本之后,”src/main/resources/db/migration”下面脚本越来越多,带来两个问题:

  1. 脚本太多,难以维护;
  2. 通过SQL脚本无法直观地看出最新的表结构。

经验和建议:

  1. 关闭Flyway的脚本文件校验和检查,即设置validateOnMigrate=false;
  2. 定期合并历史脚本,比如将V1.0.1,V1.0.2,V1.0.3的脚本都合并到V1.0中,并删除前三个文件。

脚本合并非Flyway才需要的技能,我有一些技巧让SQL更简洁:

  1. 将ALTER语句合并到CREATE语句中;
  2. DROP与CTEATE+ALTER抵消;
  3. UPDATE视情况合并到INSERT语句中(基础数据升级),或者直接去掉(业务数据升级)。



版权声明:本文为yanzhenjingfan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。