我们有两个数据库,我们希望使用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可以正常工作,但是,如果我尝试调用迁移任务,则只更新数据库foo。
调用migrateBar任务的doFirst和doLast任务,但是,来自migrateBar的第二次不会调用tasks.flywayMigrate.execute()任务。
如何让flyway从一个任务中迁移foo和bar?
答案 0 :(得分: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)
我建议提交功能请求以支持相同类型的多个任务,并提供一种方便的配置方法。
答案 1 :(得分:0)
我也有同样的问题。我想为不同的数据库运行flyway迁移,甚至是在一个gradle构建中使用不同配置的同一数据库。 对于每个数据库,我需要迁移普通数据表和静态数据表,因此我使用两个flyway版本表以及脚本的两个位置。 E.g。
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所述,无论你多久打电话,飞行任务都只会执行一次。
我找到的解决方法似乎并不是最好的,但它确实有效:
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插件配置)