Обновление Play Framework DB с помощью Heroku - PullRequest
4 голосов
/ 23 декабря 2011

Я использую 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 ]

7 голосов
/ 23 декабря 2011

Свойство jpa.ddl должно быть none в режиме Prod. Обновление рискованно в производственном процессе, так как может привести к поломке БД (как кажется, это происходит с вами!

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

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

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

6 голосов
/ 23 декабря 2011

Вам нужно запустить эволюцию базы данных Play на Heroku:

heroku run "play evolutions:apply --%prod"
1 голос
/ 16 января 2012

Просто примечание, в инструкции для heroku вы должны включить db в свой .gitignore, так что если вы используете это:

heroku run "эволюция игры: применить -% prod"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...