• flyway的学习


    Flyway 是一款开源的数据库版本管理工具。管理数据库变更的版本。

    flyway工作流程如下:

    1. 项目启动,应用程序完成数据库连接池的建立后,Flyway自动运行。
    2. 初次使用时,flyway会创建一个flyway_schema_history 表,用于记录sql执行记录。
    3. flyway会扫描项目指定路径下(默认是classpath:db/migration )的所有sql脚本,与 flyway_schema_history表脚本记录进行比对。如果数据库记录执行过的脚本记录,与项目中的sql脚本不一致,flyway会报错并停止项目执行。
    4. 如果校验通过,则根据表中的sql记录最大版本号,忽略所有版本号不大于该版本的脚本。再按照版本号从小到大,逐个执行其余脚本。

    使用:
    pom.xml引入依赖:

    <dependencies>
    	<dependency>
    		<groupId>org.flywaydbgroupId>
    		<artifactId>flyway-coreartifactId>
    		<version>7.7.3version>
    	dependency>
    
    	<dependency>
    		<groupId>org.springframework.bootgroupId>
    		<artifactId>spring-boot-starter-jdbcartifactId>
    	dependency>
    
    	<dependency>
    		<groupId>mysqlgroupId>
    		<artifactId>mysql-connector-javaartifactId>
    	dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    application.yml

    server:
      port: 80
    
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false # MySQL在高版本需要指明是否进行SSL连接 解决则加上 &useSSL=false
        username: root
        password: 123456
      # flyway配置 可参考:https://flywaydb.org/documentation/usage/commandline/migrate
      flyway:
        # 是否启用 默认启用
        enabled: true
        # sql迁移 https://flywaydb.org/documentation/concepts/migrations.html#versioned-migrations
        locations:
          - classpath:db/cong
        # 版本更新历史记录表
        table: flyway_schema_history
        # 到新的环境中,数据库中有数据,且没有t_db_version表时,是否执行迁移操作
        # false:在启动时会报错,并停止迁移;
        # true: 生成history表并完成所有迁移;
        baseline-on-migrate: true
        # 在迁移时,是否校验旧脚本有变更
        validate-on-migrate: true
        # 检测迁移脚本的路径是否存在,若不存在则抛出异常
        check-location: false
        # 禁用Flyway所有drop相关逻辑
        clean-disabled: true
        # 验证错误时是否自动清除数据库
        clean-on-validation-error: false
        sql-migration-prefix: V
        sql-migration-separator: __
        sql-migration-suffixes: .sql
    
    #生产上的配置
    #spring.flyway.sql-migration-prefix=V
    #spring.flyway.sql-migration-separator=__
    #spring.flyway.sql-migration-suffixes=.sql
    #spring.flyway.baseline-on-migrate=true
    #spring.flyway.encoding=UTF-8
    #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    #spring.datasource.url=jdbc:mysql://${DB_HOSTNAME_0}:${DB_PORT_0}/${DB_NAME_0}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    #spring.datasource.username=${DB_USERNAME_0}
    #spring.datasource.password=${DB_PASSWORD_0}
    #spring.flyway.locations=classpath:db/dev
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    然后在resources下新建db/cong,再新建V1.0.1__create_user.sql

    ------------------------- flyway脚本文件命名格式 ---------------------------------
    改表结构:V1.0.1__alter_表名.sql
    删表:V1.0.1__drop_表名.sql
    加表:V1.0.1_create_表名.sql

    CREATE TABLE `t_user`
    (
        `id`       int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
        `username` varchar(20) DEFAULT NULL COMMENT '用户名',
        `nickname` varchar(20) DEFAULT NULL COMMENT '昵称',
        PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='测试表';
    
    insert into t_user
    values (1, 'admin', '管理员'),
           (2, 'test', '测试员');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    测试修改表结构
    先在Navicat上操作,然后查看sql预览,拿到修改表结构的sql,避免因为sql报错
    在这里插入图片描述
    在这里插入图片描述
    新建V1.0.2__alter_user.sql

    ALTER TABLE `flyway`.`t_user` 
    ADD COLUMN `phone` varchar(11) NOT NULL DEFAULT '' COMMENT '手机号' AFTER `nickname`;
    
    • 1
    • 2

    注意最好去掉库名(flyway.),如存在分库分表可能会出问题

    ALTER TABLE `t_user` 
    ADD COLUMN `phone` varchar(11) NOT NULL DEFAULT '' COMMENT '手机号' AFTER `nickname`;
    
    • 1
    • 2

    启动项目
    在这里插入图片描述
    在这里插入图片描述
    查看flyway_schema_history表,发现执行成功或失败是success字段标识的
    在这里插入图片描述

    生产上遇到flyway报错的话,那条记录的success会为0,你需要先查看sql是否有错误,修改后,然后删除失败的这条记录,重新启动项目,让flyway重新加载并重新执行sql

  • 相关阅读:
    【小爱学大数据】FlinkKafkaConsumer
    数据结构与算法 | 第二章:线性表
    Linux常见操作问题
    菜鸟学习第一天
    HTML5的学习
    window10环境构建和运行skia源码
    【JMeter接口测试工具】第二节.JMeter基本功能介绍(上)【入门篇】
    Linux之Socket函数(详细篇)
    源码阅读技巧总结-Android
    【路径最全用法】python代码讲解os.path包的最全用法
  • 原文地址:https://blog.csdn.net/qq_42665745/article/details/127411747