Как следует обращаться с эволюцией инкрементной схемы базы данных - PullRequest
0 голосов
/ 14 января 2019

У меня есть приложение на платформе Play Framework с базой данных в качестве слоя персистентности (и для этого я использую Slick). Я включил эволюции, сгенерировал файл 1.sql и успешно развернул его в производство.

Клиент запрашивает новые функции, которые требуют модификации схемы базы данных - т.е. добавление новых таблиц, добавление новых столбцов и изменений в обнуляемость существующих столбцов.

После обновления всех определений таблицы Slick и связанного с ней кода я снова создаю схему и помещаю ее как 2.sql. Эволюции правильно запрашиваются для запуска, но ... сгенерированные эволюции не отражают инкрементное обновление поверх состояния 1.sql, а скорее указывают, как создать схему базы данных с нуля (т. Е. CREATE TABLE со всеми столбцами, включая новые, а чем ДОБАВИТЬ КОЛОННУ из казусов).

Возможно ли добиться инкрементного обновления, чтобы я мог легко запустить его в производственном режиме, чтобы получить базу данных от ревизии № 1 до ревизии № 2 (SQL «diff» между № 1 и № 2), или мне нужно вручную создать эти эволюции?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы должны вручную создать эти эволюции после v1.

Для наших продуктов мы оставляем «генерировать эволюции» включенными, пока продукты находятся в стадии разработки. Как только v1 будет готов к развертыванию, мы отключим автоматическую генерацию эволюции и начнем с ручной эволюции.

Хотя это может показаться неоптимальным, нам, как команде, удобнее знать, что люди кодируют и анализируют SQL-выражения DDL (а иногда и DML) для эволюции, а не автоматический сценарий, решающий, что, возможно, таблицу следует отбросить и воссоздал. В некоторых продуктах у нас есть несколько сотен evo, охватывающих годы непрерывного совершенствования и адаптации. Система работает очень хорошо.

0 голосов
/ 14 января 2019

Вам нужно вносить только различия в сценарии эволюции.

Пример

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...