Перейти к содержимому

Environment Diff

Функция Environment Diff позволяет сравнивать схемы баз данных двух окружений рядом. Полезно для понимания изменений схемы в ветви перед слиянием обратно в родителя или для аудита структурных различий между любыми двумя окружениями.

Сравнение diff схем окружений


Движок сравнения выявляет структурные различия между окружениями в три этапа:

  1. Анализ схемы: Система интроспектирует исходное и целевое окружения, чтобы понять их полную структуру — таблицы, столбцы, индексы, ограничения и связи.
  2. Сравнение: Две структуры сравниваются по семантике только вперёд (описана ниже). Движок точно определяет, какие изменения из исходного окружения отсутствуют в целевом.
  3. Генерация миграции: Для каждого обнаруженного изменения система автоматически генерирует соответствующие SQL-команды для безопасного применения этого изменения в целевом окружении.

Движок diff использует семантику только вперёд. Это означает:

  • Объекты, существующие в источнике, но не в цели → отображаются как CREATED (их нужно создать в цели)
  • Объекты, существующие в обоих → сравниваются поле за полем, различия показываются как изменения
  • Объекты, существующие только в целине отображаются как DROPPED

Это важное проектное решение. Если таблица существует только в целевом окружении, её никогда не было в источнике. Показывать её как TABLE_DROPPED было бы вводящим в заблуждение, поскольку в источнике не выполнялась операция удаления. Diff фокусируется исключительно на изменениях, возникших в источнике и требующих распространения в цель.

Исключение: Для изменений на уровне столбцов в таблицах, существующих в обоих окружениях, COLUMN_DROPPED обнаруживается, так как представляет фактическую операцию удаления столбца, выполненную в источнике.


Движок diff обнаруживает следующие категории изменений схемы:

Тип измененияОписаниеBreaking
TABLE_CREATEDТаблица есть в источнике, но не в целиНет
COLUMN_ADDEDВ таблицу в источнике добавлен новый столбецНет
COLUMN_DROPPEDСтолбец есть в цели, но удалён в источникеДа
COLUMN_TYPE_CHANGEDИзменён тип данных столбцаЗависит*
COLUMN_NULLABLE_CHANGEDИзменено ограничение nullable столбцаЗависит
COLUMN_DEFAULT_CHANGEDИзменено значение по умолчанию столбцаНет
INDEX_CREATEDДобавлен новый индексНет
INDEX_DROPPEDУдалён индексНет
ENUM_CREATEDНовый тип enum есть в источнике, но не в целиНет
ENUM_VALUE_ADDEDВ enum добавлено новое значениеНет
ENUM_VALUE_REMOVEDИз enum удалено значениеДа
VIEW_CREATEDПредставление есть в источнике, но не в целиНет
VIEW_MODIFIEDИзменено SQL-определение представленияНет
RELATIONSHIP_ADDEDДобавлена новая связь по внешнему ключуНет
RELATIONSHIP_DROPPEDУдалена связь по внешнему ключуДа

* Сужение типа (например, textvarchar(50) или int8int4) классифицируется как breaking, так как может вызвать потерю данных. Расширение типа (например, varchartext) классифицируется как безопасное.

Примечание: Верхнеуровневые TABLE_DROPPED, ENUM_DROPPED и VIEW_DROPPED не генерируются diff «только вперёд». Объекты, существующие только в цели, с точки зрения источника не считаются «удалёнными».


Представление diff поддерживает выборочное применение изменений. Пользователи могут:

  • Выбирать или снимать выбор с отдельных изменений с помощью флажков
  • Выбирать или снимать выбор со всех изменений в группе (например, всех изменений для конкретной таблицы) с помощью флажка группы
  • Изменения Breaking (деструктивные) по умолчанию не предвыбраны — пользователь должен явно согласиться

При применении merge будут включены только выбранные изменения.


query EnvironmentDiff($input: EnvironmentDiffInput!) {
environmentDiff(input: $input) {
success
message
changes {
changeType
objectType
objectName
fieldName
oldValue
newValue
isBreaking
sql
}
summary {
totalChanges
breakingChanges
addedTables
droppedTables
modifiedTables
}
}
}

Variables:

{
"input": {
"projectId": "f7e4a264-d659-4719-91e8-c2d74654e529",
"sourceEnvironment": "master",
"targetEnvironment": "staging"
}
}

Каждая запись в массиве changes представляет одно изменение схемы со следующими полями:

  • changeType: Один из перечисленных выше идентификаторов типа изменения.
  • objectType: Тип затронутого объекта БД (table, column, index, enum, view, relationship).
  • objectName: Имя затронутого объекта (например, имя таблицы).
  • fieldName: Для изменений на уровне столбца — имя конкретного столбца.
  • oldValue / newValue: Значения до и после для изменений (например, "varchar(255)""text").
  • isBreaking: Булево значение, указывающее, может ли это изменение вызвать потерю данных или нарушение API.
  • sql: Сгенерированный DDL-оператор для применения этого изменения.