Grails 3运行时自动数据库自定义SQL

时间:2016-09-19 20:52:46

标签: database grails initialization customization grails-3.0

我们有一个包含大约100个表的大型应用程序。我们一直在发布之间手动更新数据库。

我们最近也从 Grails 2 切换到 Grails 3

我们现在需要应用程序(有史以来第一次)从头开始创建一个新的数据库,这是自使用Grails 3以来的第一次。

数据库变化很大,需要一些手动运行时自定义。

为了使问题复杂化,应用程序也在使用Quartz

问题是:

在Application初始化表之后,但在Application和Quartz开始运行之前,我们需要注入这组自定义SQL。插入SQL的正确位置在哪里?

我尝试过Application.groovyBootstrap.groovy之类的内容,但无法确定(使用Grails 3)注入此自定义SQL的适当位置。例如,Quartz任务正在运行并尝试访问某些表,但它们尚未经过纠正"然而,应用程序正在抛出错误。

更新

我在Bootstrap.groovy

中尝试了以下操作
Tag.withTransaction {
    String updateSQL = "ALTER TABLE tag DROP COLUMN class;"

    def sql = new groovy.sql.Sql(dataSource)
    sql.executeUpdate(updateSQL)
}

Tag.withTransaction {
    Tag newTag
    newTag = new Tag(name: 'TAG 1').save(flush: true)
}

Tag.withTransaction {
    List tags = Tag.findAll()
    println("===  Tag Size = ${tags.size()}")
}

executeUpdate()引发了无法找到列class的异常。

但是,如果我重新排序这三个部分并使用以下内容:

Tag.withTransaction {
    Tag newTag
    newTag = new Tag(name: 'TAG 1').save(flush: true)
}

Tag.withTransaction {
    List tags = Tag.findAll()
    println("===  Tag Size = ${tags.size()}")
}

Tag.withTransaction {
    String updateSQL = "ALTER TABLE tag DROP COLUMN class;"

    def sql = new groovy.sql.Sql(dataSource)
    sql.executeUpdate(updateSQL)
}

然后executeUpdate()成功完成(尽管由于Quartz作业已在运行,但为时已晚)。

我根本不明白这一点。

感谢您的建议。现在我将尝试数据库迁移插件,但仍然会欣赏其他建议。

0 个答案:

没有答案