我们有一个包含大约100个表的大型应用程序。我们一直在发布之间手动更新数据库。
我们最近也从 Grails 2 切换到 Grails 3 。
我们现在需要应用程序(有史以来第一次)从头开始创建一个新的数据库,这是自使用Grails 3以来的第一次。
数据库变化很大,需要一些手动运行时自定义。
为了使问题复杂化,应用程序也在使用Quartz
。
问题是:
在Application初始化表之后,但在Application和Quartz开始运行之前,我们需要注入这组自定义SQL。插入SQL的正确位置在哪里?
我尝试过Application.groovy
和Bootstrap.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作业已在运行,但为时已晚)。
我根本不明白这一点。
感谢您的建议。现在我将尝试数据库迁移插件,但仍然会欣赏其他建议。