【问题标题】:Grails database migration plugin updateOnStart is not workingGrails 数据库迁移插件 updateOnStart 不起作用
【发布时间】: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 我尝试将更改日志复制到不同的位置,但我仍然收到此错误。

标签: grails groovy database-migration


【解决方案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://stackoverflow.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 上部署我的战争,然后在部署期间完成我的迁移......
    猜你喜欢
    • 2013-09-20
    • 2011-01-07
    • 2014-07-01
    • 2012-05-20
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多