Как следует обращаться с эволюцией инкрементной схемы базы данных
У меня есть приложение на платформе Play Framework с базой данных в качестве постоянного слоя (и для этого я использую Slick). Я включил эволюции, сгенерированный 1.sql
файл и успешно выкатил его в производство.
Клиент запрашивает новые функции, которые требуют модификации схемы базы данных - т.е. добавление новых таблиц, добавление новых столбцов и изменений в обнуляемость существующих столбцов.
После того, как все определения таблиц Slick и соответствующий код обновлены, я сгенерирую схему еще раз и разместу ее как 2.sql
, Эволюции правильно запрашиваются для запуска, но... сгенерированные эволюции не отражают инкрементное обновление поверх состояния 1.sql, а скорее указывают, как создать схему базы данных с нуля (т. Е. CREATE TABLE со всеми столбцами, включая новые, а чем ДОБАВИТЬ КОЛОННУ казусов).
Можно ли добиться инкрементного обновления, чтобы я мог легко запустить его в рабочей среде, чтобы получить базу данных от ревизии № 1 до ревизии № 2 (SQL "diff" между № 1 и № 2), или мне нужно вручную создавать эти эволюции?
2 ответа
Вы должны вручную создать эти эволюции после v1.
Для наших продуктов мы оставляем "генерировать эволюции" включенными, пока продукты находятся в стадии разработки. Как только v1 будет готов к развертыванию, мы отключим автоматическую генерацию эволюции и начнем с ручной эволюции.
Хотя это может показаться неоптимальным, нам, как команде, удобнее знать, что люди кодируют и анализируют SQL-выражения DDL (а иногда и DML) для эволюции, а не автоматический сценарий, решающий, что, возможно, таблицу следует отбросить и воссоздать. В некоторых продуктах у нас есть несколько сотен evo, охватывающих годы непрерывного совершенствования и адаптации. Система работает очень хорошо.
Вам нужно вносить только различия в сценарии развития.
пример
1.sql
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
2.sql
ALTER TABLE Persons ADD Email varchar(255);
Теперь ваша проблема:
Я генерирую схему еще раз и помещаю ее как 2.sql
Вы сгенерировали его снова, чтобы ваши файлы выглядели как
1.sql
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
2.sql
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
ALTER TABLE Persons ADD Email varchar(255);
Вам нужно внести в 2.sql только инкрементальные изменения в схеме, как в моем примере.