Как обрабатывать эволюцию базы данных Play Framework 2 в производстве

Кажется, что когда я меняю свои модели, Play Framework просит меня запустить script, который удаляет всю мою схему и воссоздает ее. Очевидно, что это не сработает для производства, и каков правильный способ справиться с этим в процессе производства?

Заметьте, я использую ebean и Postgres, и хостинг на heroku.

Ответ 1

К сожалению, Ebean может создать только CREATE DDL (а не UPDATE DDL) (как ответил в своей группе), поэтому вам нужно для перехода на ручные изменения КАК МОЖНО СКОРЕЕ.

некоторые правила:

  • Всегда создавайте резервную копию своей живой БД перед выполнением любых изменений:)
  • плагин ebean воссоздает весь DDL, если он создал только 1.sql эволюцию, созданную им
  • Вам нужно удалить два первых комментария из 1.sql и начать писать собственные эволюции со следующими цифрами 2.sql, 3.sql и т.д. Попытайтесь разместить как можно больше моделей/полей до перехода к ручным изменениям. Самая большая часть будет выполняться автоматически плагином.
  • Ручная эволюция должна содержать ALTERS для существующих таблиц/столбцов вместо DROP/CREATE, они должны иметь оба: Ups и Downs для каждого изменения.
  • старайтесь поместить как можно больше изменений в каждую эволюцию, легче управлять, а затем писать отдельную эволюцию для каждого небольшого изменения.

De facto иногда просто проще модифицировать структуру БД с помощью DB gui, так или иначе он работает в основном для одного разработчика... когда вам нужно поделиться своим кодом с другими разработчиками, разработка новых решений будет лучшим вариантом.

Если через некоторое время вы добавите следующую "большую" часть новых моделей, вы сможете снова включить временный автоматический DDL и использовать локальный git только для копирования новых частей. Затем верните собственную революцию и вставьте новые части, созданные плагином Ebean.

Ответ 2

Biesior в основном подвел итоги довольно хорошо. Однако, как новичок в Play, я считаю, что может быть полезно немного пояснить конкретный пример.

Во-первых, следующий пример для Java.

Предположим, вы добавили новое поле

public String dum_str;

в вашей модели Dum. Тогда вам понадобится 2.sql под conf/evolutions/ следующим образом:

# --- !Ups
ALTER TABLE dum ADD COLUMN dum_str VARCHAR(255);

# --- !Downs
ALTER TABLE dum DROP dum_str;

Надеюсь, это было бы полезно.

Ответ 3

Резервное копирование как script текущего db. Внесите изменения в модель Java. Пусть Play применит изменения и воссоздает БД Затем восстановите свои данные.

Attn: не изменять существующие имена полей, иначе это не сработает.