在 Flyway 和 Gradle 中执行扩展任务后运行 PLpgsql 脚本

问题描述 投票:0回答:1

我有一个 Java Spring 应用程序,使用 Gradle 进行依赖项管理,连接到 Postgres 数据库。我正在测试它并不断应用迁移,对架构进行更改,从而最终经常清理数据库。

Gradle 中的 FlywayClean 任务不会完全清理数据库,因此我必须随后清理自定义用户、模式和角色,这是我使用几个 pgsql 脚本完成的。

由于我正在处理大量模式,因此我还将

flywayClean
任务扩展为单独的模式清理任务,以及一个大型的“清理所有模式”任务。

现在我想在执行大

dbClean
任务(包括所有其他 schemaClean 小任务)后运行我的脚本,但我遇到了一些陷阱。

我尝试了两种方法:

  1. 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

  1. 使用

    afterClean
    从 Flyway 回拨

    这可行,但问题是它被调用到从 FlywayClean 继承的所有任务,这对于我的脚本正在执行的操作来说很麻烦。我只想让它在 dbClean 任务之后运行。

    
    

  2. 我认为方法1应该是可行的,但在我尝试使用@Grab或使用
GroovyClassLoader(getClass().getClassLoader())

调用后,我不知道如何解决驱动程序错误。

如何使用 Gradle 和 Groovy 在扩展 Flyway 任务后执行 Postgres PL/pgSQL 脚本?

postgresql gradle groovy build.gradle flyway
1个回答
0
投票

要加载它,请在调用 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() } }

	
© www.soinside.com 2019 - 2024. All rights reserved.