使用Heroku进行Framework Framework DB升级

时间:2011-12-23 09:14:23

标签: java heroku playframework

我正在使用Play Framework(1.2.4)我创建了一个UserAccount对象,并将其部署到Heroku。工作得很好。然后我在isAdmin类中添加了UserAccount字段,在本地部署它并且工作正常(但我使用的是内存中的数据库),然后我将它部署在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

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

3 个答案:

答案 0 :(得分:7)

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

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

  1. 在Heroku应用程序上安装Heroku SQL控制台(来自here
  2. jpa.ddl 更改为 none
  3. 使用SQL控制台连接到您的heroku数据库并应用您拥有的任何修复/更新
  4. 将应用程序重新上传到Heroku(记得在本地做一个新的提交,或者Heroku会说代码已经是最新的)
  5. 这应该有用。

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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

heroku run“play evolutions:apply - %prod”

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