我有一个 Java Spring 应用程序,使用 Gradle 进行依赖项管理,连接到 Postgres 数据库。我正在测试它并不断应用迁移,对架构进行更改,从而最终经常清理数据库。
Gradle 中的 FlywayClean 任务不会完全清理数据库,因此我必须随后清理自定义用户、模式和角色,这是我使用几个 pgsql 脚本完成的。
由于我正在处理大量模式,因此我还将
flywayClean
任务扩展为单独的模式清理任务,以及一个大型的“清理所有模式”任务。
现在我想在执行大
dbClean
任务(包括所有其他 schemaClean 小任务)后运行我的脚本,但我遇到了一些陷阱。
我尝试了两种方法:
Groovy SQL 实例和执行(导入 groovy.grape.Grape 和 groovy.sql.Sql):
task dbClean (type: org.flywaydb.gradle.task.FlywayCleanTask) {
group = 'dbClean'
description = 'Cleans all schemas'
doLast {
@GrabConfig(systemClassLoader=true)
@Grab(group='org.postgresql', module='postgresql', version='42.7.3')
def dbUrl = "${dbJdbc}//${dbHost}"
def dbUser = dbUser
def dbPassword = dbPassword
def dropSchemasSql = file('path/to/DropSchemas.sql')
def dropRolesAndUsersSql = file('path/to/DropRolesAndUsers.sql')
def dropSchemas = dropSchemasSql.text
def dropRolesAndUsers = dropRolesAndUsersSql.text
def sql = Sql.newInstance(dbUrl, dbUser, dbPassword, 'org.postgresql.Driver')
sql.execute(dropSchemas)
println 'dropSchemas executed.'
sql.execute(dropRolesAndUsers)
println 'dropRolesAndUsers executed.'
sql.close()
}
}
这种 Groovy 方法给了我一个错误
任务“:dbClean”执行失败。
java.sql.SQLException:找不到适用于 jdbc 的驱动程序:postgresql://mycontainer.docker.networked:5432/myDatabase
使用
afterClean
从 Flyway 回拨
这可行,但问题是它被调用到从 FlywayClean 继承的所有任务,这对于我的脚本正在执行的操作来说很麻烦。我只想让它在 dbClean
任务之后运行。
GroovyClassLoader(getClass().getClassLoader())
调用后,我不知道如何解决驱动程序错误。
如何使用 Gradle 和 Groovy 在扩展 Flyway 任务后执行 Postgres PL/pgSQL 脚本?
要加载它,请在调用 SQL 实例之前使用 Groovy 的
classLoader
。 然后您可以使用
doLast
在您想要的特定任务结束时运行脚本。 (dbClean
).我使用以下答案作为参考:
Gradle buildscript 找不到 Postgresql JDBC 驱动程序无法从 gradle 构建脚本查询数据库
task dbClean {
// Add dependencies here, in this case PostgreSQL
configurations {
jdbc
}
dependencies {
jdbc 'org.postgresql:postgresql:42.7.3'
}
group = 'dbClean'
description = 'Cleans all schemas'
doLast {
def dbUrl = "jdbc:postgresql://mycontainer.docker.networked:5432/myDatabase"
def dbUser = dbUser
def dbPassword = dbPassword
def dropSchemasSql = file('path/to/DropSchemas.sql')
def dropRolesAndUsersSql = file('path/to/DropRolesAndUsers.sql')
def dropSchemas = dropSchemasSql.text
def dropRolesAndUsers = dropRolesAndUsersSql.text
// Call Sql.classLoader, add to configurations
def sqlClassLoader = groovy.sql.Sql.classLoader
configurations.jdbc.each { sqlClassLoader.addURL it.toURI().toURL() }
def sql = groovy.sql.Sql.newInstance(dbUrl, dbUser, dbPassword, 'org.postgresql.Driver')
sql.execute(dropSchemas)
println 'dropSchemas executed.'
sql.execute(dropRolesAndUsers)
println 'dropRolesAndUsers executed.'
sql.close()
}
}