Gradle flyway脚本更新多个数据库

时间:2017-12-05 15:03:52

标签: gradle flyway

我有一个Gradle脚本,它使用flyway插件创建一些数据库表,现在我需要更新脚本,以便它可以使用2个独立的flyway脚本集,每个脚本都更新一个单独的数据库。

在脚本的单数据库版本中,我只是这样做:

flyway {
    url = 'jdbc:edb://localhost:5432/mydb'
    schemas = ['my_schema']
    user = 'my_user'
    password = 'my_pass'
    locations = ['filesystem:src/main/resources/db/flyway/my_db']
}

我一直在尝试声明一个新任务来运行第二个db的脚本:

task flywayMigrate2 << {
    ext {
        flyway {
            url = 'jdbc:edb://localhost:5432/mydb2'
            schemas = ['my_schema2']
            user = 'my_user2'
            password = 'my_pass2'
            locations = ['filesystem:src/main/resources/db/flyway/my_db2']
        }
    }    
}

flywayMigrate2.finalizedBy flywayMigrate

我的Gradle技能很差,但我知道这不是正确的方法 - 我的理解是ext块会覆盖原始的flyway配置,所以如果我想运行{{ 1}} flywayMigrate之后,它将继续使用第二组配置值,而不是恢复到原始集。

我不能成为第一个需要这样做的人,但是我很难找到一个体面的方法,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

flyway { ... }扩展名对象用于配置所有flyway任务通用的属性。每个任务还​​具有可配置的属性,我的猜测是任务级别属性覆盖flyway { ... }扩展对象上配置的属性。

我认为您只需在build.gradle中配置两个FlywayMigrateTask实例

import org.flywaydb.gradle.task.*

task migrate1(type: FlywayMigrateTask) {
    url = 'jdbc:edb://localhost:5432/mydb1'
    user = 'user1'
    locations = ['filesystem:src/main/flyway/db1/migration']
    // etc
}

task migrate2(type: FlywayMigrateTask) {
    url = 'jdbc:edb://localhost:5432/mydb2'
    user = 'user2'
    locations = ['filesystem:src/main/flyway/db2/migration']
    // etc
}

另见AbstractFlywayTask.java

答案 1 :(得分:1)

我不认为您必须定义另一个Gradle任务才能引入第二个Flyway配置。

根据documentation,您只需使用Gradle属性

覆盖
gradle -Pflyway.user=myUsr -Pflyway.schemas=schema1,schema2 -Pflyway.placeholders.keyABC=valXYZ

或系统属性

gradle -Dflyway.user=myUser -Dflyway.schemas=schema1,schema2 -Dflyway.placeholders.keyABC=valueXYZ

或提供外部Flyway配置

gradle -Dflyway.configFiles=path/to/myAlternativeConfig.conf flywayMigrate

Flyway Gradle插件遵循以下配置顺序:

  1. 系统属性
  2. 环境变量
  3. 自定义配置文件
  4. Gradle属性
  5. build.gradle中的Flyway配置部分
  6. <user-home>/flyway.conf
  7. Flyway Gradle插件默认
  8. 或者,您可以引入一项新任务,覆盖Flyway的Gradle属性。

    task migrate2(FlywayMigrateTask) {
    
       project.ext['flyway.user']='myUsr'
       project.ext['flyway.password']='mySecretPwd'
       project.ext['flyway.schemas']='schema1,schema2,schema3'
       project.ext['flyway.placeholders.keyABC']='valueXYZ'
       project.ext['flyway.placeholders.otherplaceholder']='value123'
    
    }