在flyway中使用共享数据库脚本

Dav*_* CK 6 groovy gradle flyway spring-boot

我有许多使用 Spring-Boot / Gradle 用 Groovy 编写的项目。所有这些应用程序都为不同的客户端执行类似的工作,但共享大量功能。

为了避免代码重复,我将共享组件分离到一个库中,当然这对于 Groovy 代码来说效果很好。但是,该库还包含 Flyway 脚本来创建该库所依赖的架构。

由于数据隔离规则,并且为了保持应用程序完全独立,每个应用程序需要在自己的架构中拥有自己的数据库表副本,并且每个应用程序在自己的 application.yaml 中拥有自己的数据库连接详细信息。

然后我无法弄清楚如何在单独的项目构建中使用共享的 Flyway 脚本。

我可以看到实现此目的的一种方法是每次针对适当的数据库运行库的 Flyway 迁移多次(每个应用程序一次),但这将涉及将所有应用程序的数据库详细信息放入库中 - 这又是重复。

我可以看到实现此目的的另一种方法是将 Flyway 脚本放入应用程序项目中,但这将涉及从库中复制脚本,因此我将拥有 n 个副本,而不是一个副本。这将使更改变得很痛苦(如果我想将更改应用到所有或许多项目),并且还将应用程序与应该被库隐藏的数据库模式定义联系起来。

还有其他人处理过这个问题吗?我错过了什么明显的事情吗?或者我只是要求 Flyway 做一些它不能做的事情?

谢谢

lan*_*ava 1

你的公共类文件和flyway脚本在同一个文件中吗.jar文件中吗?如果这是真的,那么您将不希望该 jar 位于您的 buildscript 类路径中,因此我建议将脚本提取到文件夹中并从文件系统中查找。

例如:

buildscript {
    classpath 'my.db:driver:1.0'
}
apply plugin: 'groovy'
configurations {
    flywayScripts { traisitive = false }
}
dependencies {
    compile 'com.foo:common:1.0' // assuming you also want to compile against common classes
    flywayScripts 'com.foo:common:1.0'
}
task extractFlywayScripts(type: Copy) {
    from zipTree(configurations.flywayScripts.singleFile).matching {
        include 'path/to/migration/scripts/*.xml'
    }
    into "$buildDir/flywayScripts"
}

// wire the extraction task into the DAG
flywayMigrate.dependsOn extractFlywayScripts

flyway {
    def yamlConfig = parseYaml('path/to/application.yaml') // TODO: implement parseYaml(...)
    locations = ["filesystem:$buildDir/flywayScripts", "filesystem:src/main/resources/db/migration"]
    url = yamlConfig.url
    user = yamlConfig.user
    password = yamlConfig.password

    // etc        
}
Run Code Online (Sandbox Code Playgroud)