Управление несколькими базами данных с помощью плагина gradle миграции flyway

У нас есть две базы данных, для которых мы хотели бы управлять их миграциями с помощью плагина gradle flyway.

Я хотел бы иметь одну задачу, которая может переносить обе базы данных. Однако я не могу заставить задачу 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 усовершенствованный.

однако задачи doFirst и doLast задачи migrateBar называются задачами.flywayMigrate.задача execute () не вызывается во второй раз из migrateBar.

Как я могу заставить flyway перенести foo и bar из одной задачи?

2 ответов


во-первых, вы никогда не должны называть 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)

Я рекомендую подать запрос функции для поддержки нескольких задач одного типа, с удобным способом настроить их.


у меня тоже была такая же проблема. Я хотел запустить миграции flyway для разных баз данных и даже для одной базы данных с разными конфигурациями в одной сборке gradle. для каждой базы данных мне нужно перенести обычные таблицы данных и статические таблицы данных, поэтому я использую две таблицы версий 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 ....

как Питер заявляет выше, задачи flyway выполняются только один раз, независимо от того, как часто вы их вызываете.

обходной путь i найденный не кажется самым приятным, но он работает:

в 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'"

относится к себе, поэтому весь код содержится в одной сборке.файл gradle. Вызов gradle тогда:

gradle migrateFlywayDevData migrateFlywayDevStatic ...

Это первая версия. таким образом, код может быть легко улучшен. Однако это решение позволяет выполнять задачи flyway несколько раз с одним gradle вызов.

не стесняйтесь комментировать (конфигурация плагина flyway не показана здесь)