Saltar al contenido

Validación del esquema

Cuando los esquemas evolucionan entre instantáneas (se añaden, eliminan o renombran columnas), merql detecta y muestra estas diferencias. Las discrepancias de esquema no bloquean la combinación, pero se notifican para que quien realiza la llamada decida cómo proceder.

Detección

SchemaValidator::validate() compara los conjuntos de columnas de cada tabla en las instantáneas base, nuestra y suya. Informa de lo siguiente:

  • Columnas añadidas en la nuestra (presentes en la nuestra, pero no en la base)
  • Columnas eliminadas en la nuestra (presentes en la base, pero no en la nuestra)
  • Columnas añadidas en la suya
  • Columnas eliminadas en la suya
PHP
use Merql\Merge\ThreeWayMerge;

$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);

if ($result->hasSchemaMismatches()) {
    foreach ($result->schemaMismatches() as $mismatch) {
        echo $mismatch->getMessage() . "\n";
        // "Schema mismatch on table 'posts': columns added in theirs: subtitle"
    }
}

Qué se detecta

Cambio Detectado Notas
Columna añadida Sí Se informa por cada parte (nuestra/suya)
Columna eliminada Sí Se informa por cada parte
Tipo de columna cambiado No Se guardan los tipos, pero no se comparan
Columna renombrada No Aparece como una adición y una eliminación
Clave primaria cambiada No La identidad se fija al capturar la instantánea

Comportamiento durante la combinación

Cuando una columna existe en una instantánea, pero no en otra, la combinación trata el valor de la columna ausente como null. Esto significa lo siguiente:

  • Una columna añadida en theirs con un valor no nulo aparece como null -> value (se acepta el cambio de theirs)
  • Una columna eliminada en theirs aparece como si tuviera null en todas las filas de theirs

La fusión continúa y genera un resultado. Las discrepancias del esquema son informativas. Quien realiza la llamada debe verificar que el esquema de la base de datos de destino coincida con los datos fusionados antes de aplicarlos.

Acceder a las discrepancias

Las discrepancias del esquema están disponibles tanto en ThreeWayMerge (mediante schemaMismatches()) como en MergeResult (mediante schemaMismatches() y hasSchemaMismatches()). Se conservan a través de ConflictResolver::resolve().

PHP
// On the merge result directly
$result->hasSchemaMismatches(); // bool
$result->schemaMismatches();    // list<SchemaException>

// Each mismatch is a SchemaException with a descriptive message
foreach ($result->schemaMismatches() as $e) {
    // $e->getMessage() includes table name and column details
}