Grails 数据库迁移插件 updateOnStart 不起作用

Posted

技术标签:

【中文标题】Grails 数据库迁移插件 updateOnStart 不起作用【英文标题】:Grails database migration plugin updateOnStart is not working 【发布时间】:2014-05-19 01:21:31 【问题描述】:

我需要一些帮助。如文档所述,我已配置数据库迁移插件:

grails.plugin.databasemigration.updateOnStart = true
grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']

这在运行“grails run-app”时效果很好。我的数据库已按预期迁移,但是在部署我的“grails war”工件时我将如何获得这种行为?

我已经在 tomcat 上对其进行了测试,通过手动将工件复制到 tomcat/webapps 文件夹,但在部署期间,hibernate 抱怨缺少列(应该由数据库迁移插件创建的列)。

有什么想法吗?

谢谢!

【问题讨论】:

您的问题解决了吗?我遇到了同样的问题,似乎 grails 没有收到 changelog.groovy,我收到了 changelog.groovy not found 我尝试将更改日志复制到不同的位置,但我仍然收到此错误。 【参考方案1】:

你确定这两行代码在生产环境中也可用吗?

这是我通常在应用程序中执行的示例:

environments 
    development 
        grails.plugin.databasemigration.updateOnStart = true
        grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
        // ... other useful development settings
    
    test 
        grails.plugin.databasemigration.updateOnStart = true
        grails.plugin.databasemigration.autoMigrateScripts = ['RunApp','TestApp']
        grails.plugin.databasemigration.forceAutoMigrate = true
        grails.plugin.databasemigration.dropOnStart = true
        if (loadTestData) 
            grails.plugin.databasemigration.updateOnStartFileNames = ['testchangelog.groovy', 'testdata.groovy']
         else 
            grails.plugin.databasemigration.updateOnStartFileNames = ['testchangelog.groovy']
        // ... something test-related
        
    
    production 
        grails.plugin.databasemigration.updateOnStart = true
        grails.plugin.databasemigration.updateOnStartFileNames = ['changelog.groovy']
        // ... production config settings
    

另外,请务必在 DataSource.groovy 中注释掉相关的 dbCreate 条目以避免迁移问题。

【讨论】:

嗯,我明白了。就我而言,我没有将它放在特定的环境中,但是我在环境块之后添加了这两行,因此(我猜)这意味着它会在任何地方运行。你如何部署你的应用程序?您是执行 grails 命令来执行此操作,还是将 app.war 复制到 tomcat(或其他容器)? 是的,将这些行从环境块中移出也应该迁移您的数据库。我怀疑您的配置中还有其他设置可能会改变行为。【参考方案2】:

查看类似问题的答案https://***.com/a/25053160/3939511

我发现 grails.plugin.databasemigration.changelogLocation 在编译时的默认值是正确的,可以将您的更改日志包含在生产战争中。 IE。我不会在编译时在Config.groovy 中设置/更改此属性。

但在部署中我设置了grails.plugin.databasemigration.changelogLocation = 'migrations',因为更改日志最终在WEB-INF/classes/migrations/ 中(作为常规脚本,而不是编译的类)。

【讨论】:

【参考方案3】:

我相信如果您执行 dbm-update 来在目标数据库中为您创建补丁。

从 Grails 网站上获取的。 http://grails-plugins.github.io/grails-database-migration/docs/manual/ref/Update%20Scripts/dbm-update.html

dbm-更新 目的

将数据库更新到当前版本。

说明

从变更日志运行所有未运行的变更集。针对在 DataSource.groovy 中为当前环境配置的数据库执行(默认为 dev)。

用法:

【讨论】:

我不明白这对我有什么帮助。我正在寻找一个不涉及运行 grails 命令的解决方案,我希望能够在 tomcat 上部署我的战争,然后在部署期间完成我的迁移......

以上是关于Grails 数据库迁移插件 updateOnStart 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Grails 数据库迁移插件问题

grails4中的数据库迁移插件错误

Grails 3 数据库迁移插件初始化错误

Grails 2.3 数据库迁移上的“加载插件管理器时出错:TomcatGrailsPlugin”

Grails 数据库迁移插件静默无法添加非空约束

带有数据库迁移插件的 Grails 3:类 [com.mypackage.security.RequestMap] 上的方法在 Grails 应用程序之外使用