【问题标题】:Play Framework DB upgrades with Heroku使用 Heroku 进行框架数据库升级
【发布时间】:2012-01-26 16:47:36
【问题描述】:

我正在使用 Play Framework (1.2.4) 我创建了一个 UserAccount 对象,并将其部署到 Heroku。工作得很好。然后我在UserAccount 类中添加了一个isAdmin 字段,在本地部署它并且工作正常(但我使用的是内存数据库),然后我将它部署在Heroku 上,现在我得到了以下异常:

2011-12-23T09:03:35+00:00 app[web.1]: play.exceptions.JavaExecutionException: org.hibernate.exception.SQLGrammarException: could not load an entity: [models.UserAccount#2]
2011-12-23T09:03:35+00:00 app[web.1]: PersistenceException occured : org.hibernate.exception.SQLGrammarException: could not load an entity: [models.UserAccount#2]
...
2011-12-23T09:03:35+00:00 app[web.1]: Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not load an entity: [models.UserAccount#2]
2011-12-23T09:03:35+00:00 app[web.1]: Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [models.UserAccount#2]
2011-12-23T09:03:35+00:00 app[web.1]: Caused by: org.postgresql.util.PSQLException: ERROR: column useraccoun0_.isadmin does not exist
...

我四处寻找如何进行数据库升级,Play 网站说 Hibernate 应该为我处理这个问题。

这是我的数据库属性:

%prod.db=${DATABASE_URL}
%prod.jpa.dialect=org.hibernate.dialect.PostgreSQLDialect
%prod.jpa.ddl=update

我做错了什么?感谢您的帮助。

【问题讨论】:

    标签: java heroku playframework


    【解决方案1】:

    在 Prod 模式下,属性 jpa.ddl 应该是 none。更新在生产中是有风险的,因为它可能会破坏数据库(因为它似乎正在发生在你身上!

    管理此问题的正确方法是:

    1. 在您的 Heroku 应用上安装 Heroku SQL 控制台(来自 here
    2. jpa.ddl 更改为 none
    3. 使用 SQL 控制台连接到您的 heroku 数据库,并应用您需要的任何修复/更新
    4. 将应用重新上传到 Heroku(记得在本地进行新的提交,否则 Heroku 会说代码已经是最新的)

    这应该可行。

    【讨论】:

    • Heroku SQL 控制台是 Ruby,因此无法安装在 Play 应用上。
    • @JamesWard 这不是真的,我把它放在我的盒子里运行并且运行良好。它打开一个 PSQL 终端,我可以玩弄数据库(使用共享数据库)。
    • 我不确定你的意思。当应用是 Play 应用时,如何“在 Heroku 应用上安装 Heroku SQL 控制台”?
    • @JamesWard 查看我在答案中的链接(这个:github.com/ddollar/heroku-sql-console)。我按照这些步骤操作,它可以工作。也许我解释它的方式是错误的(不是英语母语,有时我会混淆句子,对不起!)但我可以告诉你它有效:)
    • 哦!我现在明白了。对不起。这是一个 Heroku CLI 插件。这适用于任何应用程序。感谢您指出这一点!
    【解决方案2】:

    您需要在 Heroku 上运行 Play 数据库演化:

    heroku run "play evolutions:apply --%prod"
    

    【讨论】:

    • 感谢您的意见,我会试一试。这是一次性的事情还是每次有数据库更改时我都会这样做?此外,这对实时数据是否安全,或者我是否需要更多手动操作来处理大型数据集?
    • 哦,我明白了。这是手动更新脚本。那我就玩这些。感谢您的帮助。
    • 此解决方案仅适用于 Play 1。对于 Play 2,您能否就此提出另一个问题?
    【解决方案3】:

    请注意,heroku 的说明已将 db 包含在您的 .gitignore 中,所以如果您使用它:

    heroku 运行“play evolutions:apply --%prod”

    您将收到错误/警告。然而,令我惊讶(和高兴)重新启动该过程确实应用了我的进化并更新了我的数据库(使用下面提到的 heroku SQL 控制台验证:-))。有点神秘这是如何工作的,但很高兴它做到了!

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多