Как следует обращаться с эволюцией инкрементной схемы базы данных

У меня есть приложение на платформе 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 только инкрементальные изменения в схеме, как в моем примере.

Другие вопросы по тегам