• 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;">

  • 相关阅读:
    PHP 获取请求里的 header字段以及发送header
    宝塔链接数据库
    链表中头结点和头指针
    git How to resolve a Git “CONFLICT (modify/delete)”?
    yii 执行mysql:既要添加数据又要更新数据
    recv() failed (104: Connection reset by peer) while reading response header from upstream
    Linux磁盘空间满了,定位到mysql日志,删除
    mysql 字符乱码
    php message queue
    CGI 、fastcgi、php-cgi、php-fpm
  • 原文地址:https://www.cnblogs.com/417xiaoliu/p/11124080.html
Copyright © 2020-2023  润新知