Ir al contenido

Environment Diff

La función Environment Diff te permite comparar los esquemas de base de datos de dos entornos lado a lado. Es útil para entender qué cambios de esquema se han realizado en una rama antes de fusionarla con su padre, o para auditar diferencias estructurales entre dos entornos cualesquiera.

Comparación de diff de esquema de entornos


El motor de comparación identifica diferencias estructurales entre entornos en tres etapas:

  1. Análisis de esquema: El sistema introspecciona ambos entornos fuente y destino para entender su estructura completa — incluyendo tablas, columnas, índices, restricciones y relaciones.
  2. Comparación: Las dos estructuras se comparan siguiendo semántica solo hacia adelante (explicada abajo). El motor identifica exactamente qué cambios del entorno fuente faltan en el destino.
  3. Generación de migración: Para cada cambio detectado, el sistema genera automáticamente los comandos SQL correspondientes para aplicar ese cambio al entorno destino de forma segura.

El motor de diff usa semántica solo hacia adelante. Esto significa:

  • Objetos que existen en fuente pero NO en destino → se muestran como CREATED (necesitan crearse en destino)
  • Objetos que existen en AMBOS → se comparan campo por campo, las diferencias se muestran como modificaciones
  • Objetos que existen SOLO en destinoNO se muestran como DROPPED

Esta es una decisión de diseño importante. Si una tabla existe solo en el entorno destino, nunca estuvo presente en la fuente. Mostrarla como TABLE_DROPPED sería engañoso porque nunca se realizó una operación de eliminación en la fuente. El diff se enfoca exclusivamente en cambios que se originaron en la fuente y deben propagarse al destino.

Excepción: Para cambios a nivel de columna dentro de tablas que existen en ambos entornos, COLUMN_DROPPED SÍ se detecta porque representa una operación real de eliminación de columna realizada en la fuente.


El motor de diff detecta las siguientes categorías de cambios de esquema:

Tipo de cambioDescripciónRompiente
TABLE_CREATEDUna tabla existe en fuente pero no en destinoNo
COLUMN_ADDEDSe añadió una nueva columna a una tabla en fuenteNo
COLUMN_DROPPEDUna columna existe en destino pero fue eliminada en fuente
COLUMN_TYPE_CHANGEDSe modificó el tipo de datos de una columnaDepende*
COLUMN_NULLABLE_CHANGEDSe cambió la restricción nullable de una columnaDepende
COLUMN_DEFAULT_CHANGEDSe modificó el valor por defecto de una columnaNo
INDEX_CREATEDSe añadió un nuevo índiceNo
INDEX_DROPPEDSe eliminó un índiceNo
ENUM_CREATEDUn nuevo tipo enum existe en fuente pero no en destinoNo
ENUM_VALUE_ADDEDSe añadió un nuevo valor a un enumNo
ENUM_VALUE_REMOVEDSe eliminó un valor de un enum
VIEW_CREATEDUna vista existe en fuente pero no en destinoNo
VIEW_MODIFIEDSe cambió la definición SQL de una vistaNo
RELATIONSHIP_ADDEDSe añadió una nueva relación de clave foráneaNo
RELATIONSHIP_DROPPEDSe eliminó una relación de clave foránea

* El estrechamiento de tipo (ej: textvarchar(50) o int8int4) se clasifica como rompiente porque puede causar pérdida de datos. El ensanchamiento de tipo (ej: varchartext) se clasifica como seguro.

Nota: Los TABLE_DROPPED, ENUM_DROPPED y VIEW_DROPPED de nivel superior no se generan por el diff solo hacia adelante. Los objetos que existen solo en destino no se consideran “eliminados” desde la perspectiva de la fuente.


La vista de diff soporta aplicación selectiva de cambios. Los usuarios pueden:

  • Seleccionar o deseleccionar cambios individuales usando casillas
  • Seleccionar o deseleccionar todos los cambios dentro de un grupo (ej: todos los cambios de una tabla específica) usando la casilla del grupo
  • Los cambios rompientes (destructivos) no están preseleccionados por defecto — el usuario debe optar explícitamente

Solo los cambios seleccionados se incluirán al aplicar el 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"
}
}

Cada entrada en el array changes representa un único cambio de esquema con los siguientes campos:

  • changeType: Uno de los identificadores de tipo de cambio listados arriba.
  • objectType: El tipo de objeto de base de datos afectado (table, column, index, enum, view, relationship).
  • objectName: El nombre del objeto afectado (ej: el nombre de la tabla).
  • fieldName: Para cambios a nivel de columna, el nombre de la columna específica.
  • oldValue / newValue: Los valores antes y después para modificaciones (ej: "varchar(255)""text").
  • isBreaking: Un booleano que indica si este cambio podría causar pérdida de datos o ruptura de API.
  • sql: La declaración DDL generada para aplicar este cambio.