【问题标题】:Manage multiple database with the flyway migrations gradle plugin使用 flyway 迁移 gradle 插件管理多个数据库
【发布时间】:2013-08-10 18:10:02
【问题描述】:

我们有两个数据库,我们想使用 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']) {}

从命令行显式调用 migrateFoo 或 migrateBar 可以正常工作,但是,如果我尝试调用 migrate 任务,则只会更新数据库 foo。

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

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

【问题讨论】:

    标签: gradle flyway


    【解决方案1】:

    首先,你不应该在任务上调用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 代码库中的代码质量插件(例如 CheckstylePluginFindbugsPlugin)。按照惯例,具体任务类的名称中没有Task
    • 好的,谢谢,我会调查的。顺便说一句,杰里米在这里使用这个插件:github.com/flyway/flyway/tree/master/flyway-gradle-plugin
    • 查看对应的任务(Checkstyle)。该插件在扩展属性和任务属性之间进行映射。
    • 谢谢,伙计们。这给了我们一些好的想法。
    【解决方案2】:

    我也遇到了同样的问题。我想在 ONE gradle build 中为不同的数据库甚至具有不同配置的同一个数据库运行 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 任务只会执行一次,无论您调用它们的频率如何。

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

    在 build.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插件配置这里不展示)

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2021-09-30
      • 2015-02-17
      • 2017-07-10
      • 1970-01-01
      • 2015-05-04
      • 2014-08-02
      • 2016-11-14
      • 2018-11-26
      相关资源
      最近更新 更多