Играть! 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