2011-12-23 2 views
4

Я использую Play Framework (1.2.4) Я создал объект UserAccount, развернул его в Heroku. Отлично. Затем я добавил поле isAdmin в класс UserAccount, развернул его локально, и он работал нормально (но я использую БД в памяти), затем я развернул его на Heroku, и теперь я получаю следующее исключение:Play Framework DB обновления с 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 должен обрабатывать это для меня.

Вот мои DB свойства:

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

Что я делаю неправильно? Спасибо за помощь.

ответ

6

Вам необходимо запустить эволюции базы данных Играть на Heroku:

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

Спасибо за ввод, я попробую. Это одно время или я делаю это каждый раз, когда происходят изменения БД? Кроме того, это что-то безопасное для живых данных или мне нужно что-то более ручное, у меня есть большой набор данных? – Joel

+0

О, я вижу. Это ручные сценарии обновления. Тогда я буду играть с ними. Спасибо за помощь. – Joel

+1

Я получаю «sh: play: not found» – Bill

7

Недвижимость jpa.ddl должно быть нет когда в режиме Prod. Обновление является рискованным в производстве, поскольку это может привести к поломке DB (как это кажется, что это происходит с вами

Правильный способ справиться с этим было бы:

  1. Установите Heroku SQL консоль приложение Heroku (от here)
  2. Изменить jpa.ddl к ни
  3. Подключение к базе данных Heroku с помощью консоли SQL и применять какие-либо исправления/обновления должны
  4. Перезагрузите приложение в Heroku (не забудьте сделать новый коммит локально, или Heroku скажет, что код уже обновлен)

Это должно сработать.

+0

Консоль консоли Heroku - Ruby, поэтому ее нельзя установить в приложении Play. –

+0

@JamesWard Это неправда, у меня в моей коробке работает и отлично работает. Он открывает терминал PSQL, и я могу играть с db (используя общий DB). –

+0

Я не уверен, что вы имеете в виду. Как вы устанавливаете консоль Heroku SQL в своем приложении Heroku, когда приложение является приложением Play? –

1

Просто к сведению, инструкцию по Heroku есть включить дб в вашем .gitignore, так что если вы используете это:

Heroku run «play evolution: apply -% prod»

Вы получите сообщение об ошибке/предупреждении. Однако, к моему удивлению (и восторге), перезапуск процесса действительно применил мои эволюции и обновил мой db (проверен с помощью серверной консоли heroku, упомянутой ниже :-)). Немного загадочно, как это сработало, но счастлив!

Смежные вопросы