Gradle flyway 脚本更新多个数据库

Gradle flyway script to update multiple databases

我有一个 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']
}

我一直在尝试向 运行 第二个数据库的脚本声明一个新任务:

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 块会覆盖原始的飞路配置,所以如果我想在 flywayMigrate2 之后到 运行 flywayMigrate 它将继续使用第二组配置值而不是恢复到原始设置。

我不是第一个需要这样做的人,但我正在努力寻找合适的方法,有人可以帮忙吗?

我认为您不必定义另一个 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
  6. 中的飞路配置部分
  7. <user-home>/flyway.conf
  8. Flyway Gradle 插件默认值

或者,您可以引入一个新任务来覆盖 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'

}

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