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
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
nullen 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().
// 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
}