Стратегия генерации кода JOOQ в нескольких ветвях

#jooq

#jooq

Вопрос:

Одна из проблем, которой я хотел бы избежать, — это две ветви, обновляющие сгенерированный JOOQ код. Я полагаю, что это может привести к беспорядочному конфликту слияния. Существует ли передовая стратегия для управления изменениями БД в двух разных ветвях с помощью JOOQ?

Ответ №1:

Будущая поддержка нескольких версий схемы jOOQ

Генерация кода с несколькими версиями схемы появится в следующем выпуске с https://github.com/jOOQ/jOOQ/issues/9626

Работа над необходимой инфраструктурой для вышеупомянутого началась в jOOQ 3.15. Предстоит много работы и открытых вопросов, но в конечном итоге можно будет определить набор исходных схем, которые все должны поддерживаться одновременно:

  • Путем генерации кода
  • По времени выполнения (например * , включает только столбцы, доступные в данной версии)

Создание собственного кода с использованием представлений SQL

До тех пор вы, возможно, сможете самостоятельно создать уровень совместимости, используя представления. Например:

 -- Version 1
CREATE TABLE t (
  id INT PRIMARY KEY,
  col1 TEXT,
  col2 TEXT
);

-- Version 2
CREATE TABLE t (
  id INT PRIMARY KEY,
  -- col1 was dropped
  col2 TEXT,
  -- col3 was added
  col3 TEXT
);
 

Теперь разверните представление, которое выглядит одинаково для вашего клиентского кода для обеих версий:

 -- Version 1
CREATE OR REPLACE VIEW v (id, col1, col2, col3) AS
SELECT id, col1, col2, NULL
FROM t;

-- Version 1
CREATE OR REPLACE VIEW v (id, col1, col2, col3) AS
SELECT id, NULL, col2, col3
FROM t;
 

Если ваша СУБД поддерживает обновляемые представления, вы можете использовать их как любую другую таблицу, особенно при добавлении синтетических первичных ключей / синтетических внешних ключей к вашему сгенерированному коду.

С помощью стратегии генератора вы можете дополнительно переименовать сгенерированные имена представлений V в T (при условии, что вы исключаете фактическое T из сгенерированного), и ваш клиентский код даже не заметит, что вы эмулировали T таблицу с помощью представления.