zoukankan      html  css  js  c++  java
  • flyway使用指南

    说明

    这一段时间项目变更比较大,经常修改表结构,然后各个环境数据库均为修改,一不小心就忘掉了,等出问题才发现表结构没有更新;遂寻找数据库版本控制工具;最终确定为flyway

    flyway说明

    官网地址: https://flywaydb.org

    按照官网的说明:

    Version control for your database. Robust schema evolution across all your environments.With ease, pleasure and plain SQL.

    官网原理图: https://flywaydb.org/getstarted/how

    脚本文件名定义

    $PREFIX$VERSION__$REMARK.$SUBFIX

    常用格式如上: $preifx表示前缀,可在配置中指定,默认为 V
    $version 表示 版本,中单可以使用 ._分隔,在解析时会将_转换为.保存到schema_history表的version字段中;
    $remark 表示备注,解析后会将这部分写入到描述字段中;
    $subfix 表示后缀,可在配置中指定,默认为.sql;
    版本与描述之前使用__分隔;


    与spring boot的整合

    • 在官网的文档中找到插件部分:
    • 在链接中找到spring boot
    • 在spring boot插件与集成页面中再选择配置属性
    • 可以配置的属性

    到这里,与spring boot 整合的步骤就有了,加入pom依赖并配置相应的属性即可;

    引入maven依赖

            <dependency>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-core</artifactId>
                <version>5.2.4</version>
            </dependency>

    增加相应的配置

    # 说明,在spring boot 1.x中,属性前缀为flyway,在spring boot 2.x中为spring.flyway,需要区分不同版本
    flyway:
      # 到新的环境中数据库中有数据,且没有flyway_schema_history表时,是否执行迁移操作,如果设置为false,在启动时会报错,并停止迁移;如果为true,则生成history表并完成所有的迁移,要根据实际情况设置;
      baseline-on-migrate: false
      #  执行执行时标记的tag 默认为<<Flyway Baseline>>
      baseline-description: <<Flyway Baseline>>
      #  是否启用flyway
      enabled: true
    #  检测迁移脚本的路径是否存在,如不存在,则抛出异常
      check-location: true
    #  脚本位置
      locations: classpath:db/migration
    #  在迁移时,是否校验脚本,假设V1.0__初始.sql已经迁移过了,在下次启动时会校验该脚本是否有变更过,则抛出异常
      validate-on-migrate: true

    特别说明:如果非空数据库迁移,在目标数据库中手动建flyway_schema_history表并手动写入初始化的脚本记录,使flyway跳过最初的校验即可,后续可以保证版本的统一;

    验证

    项目启动有如下日志信息,表明校验成功;


    spring boot 中 flyway自动配置原理


    spring boot 自动化配置,其中已经内置了flyway的功能;


    spring boot 自动化配置的核心是Conditional的几个注解,根据注解来看,需要符合以下几个条件:

    1. 存在Flyway的类;
    2. 存在Datasource的类;
    3. 存在flyway起始的配置属性且enable的属性值为true;
    //生成Flyway的实例
            @Bean
            @ConfigurationProperties(prefix = "flyway")
            public Flyway flyway() {
                Flyway flyway = new SpringBootFlyway();
                if (this.properties.isCreateDataSource()) {
                    flyway.setDataSource(this.properties.getUrl(), this.properties.getUser(),
                            this.properties.getPassword(),
                            this.properties.getInitSqls().toArray(new String[0]));
                }
                else if (this.flywayDataSource != null) {
                    flyway.setDataSource(this.flywayDataSource);
                }
                else {
                    flyway.setDataSource(this.dataSource);
                }
                flyway.setLocations(this.properties.getLocations().toArray(new String[0]));
                return flyway;
            }
    //生成FlywayMigrationInitializer的实例
            @Bean
            @ConditionalOnMissingBean
            public FlywayMigrationInitializer flywayInitializer(Flyway flyway) {
                return new FlywayMigrationInitializer(flyway, this.migrationStrategy);
            }
    
    //这个类实现了InitalizingBean接口,可以在依赖注入完成后执行一些操作
    public class FlywayMigrationInitializer implements InitializingBean, Ordered
    
    //委托flyway对象完成数据库的迁移命令,到这里,spring boot中flyway的操作完成.
    @Override
        public void afterPropertiesSet() throws Exception {
            if (this.migrationStrategy != null) {
                this.migrationStrategy.migrate(this.flyway);
            }
            else {
                this.flyway.migrate();
            }
        }
    

    <wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

  • 相关阅读:
    年轻人的第一个 Spring Boot 应用,太爽了!
    面试问我 Java 逃逸分析,瞬间被秒杀了。。
    Spring Boot 配置文件 bootstrap vs application 到底有什么区别?
    坑爹的 Java 可变参数,把我整得够惨。。
    6月来了,Java还是第一!
    Eclipse 最常用的 10 组快捷键,个个牛逼!
    Spring Cloud Eureka 自我保护机制实战分析
    今天是 Java 诞生日,Java 24 岁了!
    厉害了,Dubbo 正式毕业!
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
  • 原文地址:https://www.cnblogs.com/417xiaoliu/p/11124080.html
Copyright © 2011-2022 走看看