使用flyway migrations gradle插件管理多个数据库

使用flyway migrations gradle插件管理多个数据库,gradle,flyway,Gradle,Flyway,我们有两个数据库,我们希望使用flyway的gradle插件管理它们的迁移 我希望有一个任务可以迁移两个数据库。但是,我似乎无法从一个任务中调用两次flywayMigrate任务 这是我所拥有的 task migrateFoo() { doFirst { flyway { url = 'jdbc:mysql://localhost/foo' user = 'root' password = 'pass

我们有两个数据库,我们希望使用flyway的gradle插件管理它们的迁移

我希望有一个任务可以迁移两个数据库。但是,我似乎无法从一个任务中调用两次flywayMigrate任务

这是我所拥有的

task migrateFoo() {
    doFirst {
        flyway {
            url = 'jdbc:mysql://localhost/foo'
            user = 'root'
            password = 'password'
            locations = ['filesystem:dev/src/db/foo']
            sqlMigrationPrefix = ""
            initOnMigrate = true
            outOfOrder = true
        }
    }
    doLast {
        tasks.flywayMigrate.execute()
    }
}

task migrateBar() {
    doFirst {
        flyway {
            url = 'jdbc:mysql://localhost/bar'
            user = 'root'
            password = 'password'
            locations = ['filesystem:dev/src/db/bar']
            sqlMigrationPrefix = ""
            initOnMigrate = true
            outOfOrder = true
        }
    }
    doLast {
        tasks.flywayMigrate.execute()
    }
}

task migrate(dependsOn: ['migrateFoo','migrateBar']) {}
从命令行显式调用migratefo或migrateBar都可以,但是,如果尝试调用migrate任务,则只更新数据库foo

migrateBar任务的doFirst和doLast任务都被调用,但是tasks.flywayMigrate.execute()任务不会在migrateBar中第二次被调用


如何让flyway从单个任务中同时迁移foo和bar?

首先,您不应该对任务调用
execute()
(坏事情会发生)。此外,每个Gradle调用最多执行一次任务

为了回答您的问题,flyway插件显然不支持同一类型的多个任务。从它的实现来看,我认为您必须完成自己的任务。比如:

import com.googlecode.flyway.core.Flyway
import org.katta.gradle.plugin.flyway.task.AbstractFlywayTask

class MigrateOtherDb extends AbstractFlywayTask {
    @Override
    void executeTask(Flyway flyway) {
        // set any flyway properties here that differ from
        // those common with other flyway tasks
        println "Executing flyway migrate"
        flyway.migrate()
}

task migrateOtherDb(type: MigrateOtherDb)

我建议提交一个功能请求以支持同一类型的多个任务,并使用一种方便的方式来配置它们。

我也遇到了同样的问题。我想在一个gradle构建中为不同的数据库甚至同一个具有不同配置的数据库运行flyway迁移。 对于每个数据库,我需要迁移普通数据表和静态数据表,因此我使用两个flyway版本表和两个脚本位置。例如

ENV: dev MIGRATION1: data   (locations: db/scripts/data   table: _flyway_version_data)
         MIGRATION2: static (locations: db/scripts/static table: _flyway_version_static) 

ENV: test MIGRATION1 ....
          MIGRATION2 ....
正如Peter在上面所说的,flyway任务只执行一次,不管您调用它们的频率有多高

我发现的解决方法似乎不是最好的,但它很有效:

内建gradle

task migrateFlywayDevData(type: GradleBuild) {
    buildFile = 'build.gradle'
    tasks = ['flywayMigrate']
    startParameter.projectProperties = [env: "dev", type="data"]
}

task migrateFlywayDevStatic(type: GradleBuild) {
    buildFile = 'build.gradle'
    tasks = ['flywayMigrate']
    startParameter.projectProperties = [env: "test", type="static"]
}
....(task defs for test env)
基本上,我为每个配置创建了一个新的gradle构建

“buildFile='build.gradle'”

引用自身,因此所有代码都包含在一个build.gradle文件中。 然后,gradle调用是:

gradle migrateFlywayDevData migrateFlywayDevStatic ...
这是第一个版本。所以代码可能很容易改进。 但是,此解决方案允许您通过一次gradle调用多次执行flyway任务


请随意评论(此处未显示flyway插件配置)

文档中是否有关于如何实现此功能的好的指针?基本上,任务类需要声明扩展所具有的所有属性(或更多属性),使用扩展属性作为默认值。查看Gradle代码库中的代码质量插件(例如
CheckstylePlugin
FindbugsPlugin
)。按照惯例,具体任务类的名称中没有
task
。顺便说一句,Jeremy在这里使用这个插件:检查相应的任务(
Checkstyle
)。插件在扩展属性和任务属性之间进行映射。谢谢大家。这给了我们一些好主意。