Играть! framework - проблема с базой данных с Evolutions

Я использую Play! Framework 2.0, и я застрял в раздражающей проблеме, связанной с базой данных.

Предположим, что у меня есть класс User (extends Model), который имеет несколько атрибутов (first_name, last_name, email, password и т.д.).

В какой-то момент я хочу добавить новый атрибут, скажем last_ip (на самом деле не имеет значения, что это такое). Итак, я добавляю атрибут в класс User, компилирую и запускаю.

Дело в том, что я получаю это красное предупреждение о изменениях базы данных (очевидно), которое просит меня нажать "ОТМЕНЯЕТСЯ ИЗМЕНЕНИЯ" (если я правильно помню). Это хорошо, НО! все записи базы данных стираются!

В заключение: я хочу новое поле, но я не хочу потерять все записи, которые я уже добавил в базу данных. Это возможно?

Ответ 1

Сначала вам нужно отключить автоматическую генерацию файлов Evolution, удалив первые 2 прокомментированные строки conf/evolutions/default/1.sql:

# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups
...

Затем вам нужно создать второй файл под названием conf/evolutions/default/2.sql, содержащий ваше обновление в схеме базы данных с разделом Ups и a Downs:

# --- !Ups
ALTER TABLE USER ADD COLUMN last_ip varchar(30) DEFAULT NULL;

# --- !Downs

ALTER TABLE USER DELETE COLUMN last_ip;

Ответ 2

То, что вы, вероятно, делаете, - это применение деструктивных эволюций. Если вы посмотрите в 1.sql(или независимо от вашего файла эволюции), под DOWNS у вас есть statemtnts, например "DROP DATABASE X". Всякий раз, когда Play обнаруживает изменения в файле эволюции, он запускает все эволюции вниз, а затем повторно использует эволюцию вверх, в результате теряются все ваши данные.

Подробнее: http://www.playframework.org/documentation/2.0.2/Evolutions

Ответ 3

Я предлагаю вам взглянуть на Liquibase. Liquibase обрабатывает изменения базы данных, является супер гибкой и независимой от базы данных. Я использую его в своих приложениях, чтобы убедиться, что при применении изменения базы данных вещи не удаляются или что-то еще.

Ответ 4

Вы можете отключить Evolutions, установив evolutionplugin = disabled в application.conf