Управление несколькими базами данных с помощью плагина 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 не показана здесь)