【问题标题】:Gradle flyway script to update multiple databasesGradle flyway脚本更新多个数据库
【发布时间】:2023-03-20 16:26:01
【问题描述】:

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

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

【问题讨论】:

    标签: gradle flyway


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      根据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. &lt;user-home&gt;/flyway.conf
      7. 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 配置值包含在构建脚本中,而不是在命令行中传递。我认为您的 project.ext 示例只是在做与我的 flywayMigrate2 任务相同的事情 - 即覆盖将在任务完成后保留的全局值
      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 2017-11-10
      • 2013-01-07
      • 2013-03-06
      • 2014-04-23
      • 2014-08-29
      • 2011-11-10
      • 2017-08-05
      相关资源
      最近更新 更多