Merql
Fusión de bases de datos de tres vías en PHP puro con resolución de conflictos por columna. Semántica de fusión al estilo de Git para tablas MySQL y SQLite.
composer require merql/merqlÚltima versión v0.4.1 MIT PHP 8.2+
use Merql\Merql;
Merql::init($connection);
// Snapshot all tables.
$snapshot = Merql::snapshot('baseline');
// Snapshot specific tables.
$snapshot = Merql::snapshot('baseline', ['posts', 'comments', 'users']);En la práctica
Una fusión lee tres instantáneas guardadas y devuelve las operaciones que se deben escribir y los conflictos que se deben resolver.
Fusionar tres instantáneas
Cree la instantánea base antes de que se separen las dos copias y, después, capture cada lado; por ejemplo, una base de datos activa y una copia de pruebas. ThreeWayMerge compara ambos lados con la base y fusiona los dos conjuntos de cambios.
En la pestaña de resultados, nuestra rama editó content y la ajena editó title y status de la misma fila, así que la fusión conserva las tres ediciones sin conflictos.
use Merql\Merge\ThreeWayMerge;
$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);
echo $result->operationCount(); // resolved operations
echo $result->conflictCount(); // unresolved conflictsBase: { title: "Hello", content: "Body", status: "draft" }
Ours: { title: "Hello", content: "Body v2", status: "draft" }
Theirs: { title: "New Title", content: "Body", status: "publish" }
Result: { title: "New Title", content: "Body v2", status: "publish" }Fusión de tres vías
Base, nuestra versión y la suya. Una fusión de tres vías al estilo de git sobre filas y columnas identificadas por claves, en lugar de líneas. Detecta inserciones, actualizaciones y eliminaciones en dos ramas.
Resolución a nivel de columna
Cuando ambos lados cambian la misma fila, merql compara las columnas una por una. Solo hay conflicto si se cambia la misma columna a valores distintos.
Fusión de celdas opcional
Pase un CellMergeConfig a ThreeWayMerge para fusionar columnas TEXT línea por línea con la diferencia de Myers y columnas JSON clave por clave. La fachada Merql y el CLI no la habilitan.
Varias bases de datos
Adaptadores de conexión y controladores de dialecto conectables, con MySQL y SQLite integrados.
Detección de conflictos
Actualización frente a actualización, actualización frente a eliminación, eliminación frente a actualización e inserción frente a inserción: cada caso se informa con su tabla y fila. Los conflictos entre actualizaciones también indican la columna.
Generación SQL
Instrucciones INSERT, UPDATE y DELETE con parámetros y orden compatible con FK. Vista previa de ejecución en seco o aplicación dentro de una transacción.
CLI
Cree instantáneas, compare y fusione desde la línea de comandos. Admite MySQL y SQLite mediante variables de entorno.
Probado
32 escenarios de regresión con resultados esperados escritos a mano (composer test:oracle). CI ejecuta pruebas unitarias y de integración 231 y el nivel 10 de PHPStan.
Por qué Merql
Las instantáneas son archivos
Cada instantánea es un archivo JSON que puede copiar entre máquinas o confirmar en el control de versiones. La comparación y la fusión leen esos archivos, así que se ejecutan sin conexión a una base de datos.
Revise antes de escribir
Un plan de fusión asigna un ID estable a cada operación y grupo de cambios, y conserva las filas base, nuestra, ajena y resultante. Seleccione los grupos que quiera y aplique solo esos.
Los planes obsoletos se detienen
La aplicación protegida solo escribe en filas que aún coinciden con la instantánea que revisó. Si una instrucción afecta a cero filas, se revierte la transacción y el resultado incluye el error.
Reversión con comprobación de cambios
Cree un plan de reversión a partir de las filas activas justo antes de escribirlo y guárdelo como JSON. Antes de deshacer, la comprobación de cambios compara las huellas de las filas y devuelve las operaciones cuyas filas hayan cambiado desde entonces.
Comparación con
Merql fusiona datos de filas a partir de tres instantáneas. Estas herramientas crean versiones, sincronizan o migran bases de datos; son tareas relacionadas.
| Herramienta | Ideal para | Diferencia con Merql |
|---|---|---|
| Dolt | Ideal paraDolt es una base de datos SQL que permite bifurcar, clonar, crear ramas, fusionar, enviar y recibir cambios, como en un repositorio Git. Se conecta como a cualquier base de datos MySQL y registra el historial de cada celda. | Diferencia con MerqlMerql conserva la base de datos MySQL o SQLite que ya utiliza. Guarda las tablas en archivos de instantáneas JSON y fusiona tres, con la instantánea base elegida por usted. |
| pt-table-sync | Ideal parapt-table-sync encuentra y corrige diferencias entre tablas MySQL, en una dirección o en ambas entre servidores. Al sincronizar una réplica, aplica los cambios en el origen de replicación. | Diferencia con MerqlEn una sincronización bidireccional, pt-table-sync elige una fila ganadora según una columna de conflicto y copia sus valores. Merql compara ambos lados con una base común, fusiona las ediciones en distintas columnas de una misma fila e informa los cambios incompatibles como conflictos que usted debe resolver. |
| sqldiff | Ideal parasqldiff compara dos bases de datos SQLite e imprime un script SQL que convierte la primera en la segunda. También puede escribir un conjunto binario de cambios para la extensión de sesión SQLite o resumir las filas modificadas de cada tabla. | Diferencia con MerqlUna diferencia de dos vías no permite saber si un lado añadió una fila o si el otro la eliminó. Merql añade una instantánea base para responder a esa pregunta, fusiona dos conjuntos de cambios y también funciona con MySQL. |
| Doctrine Migrations | Ideal paraDoctrine Migrations versiona el esquema de la base de datos para que los cambios de esquema se puedan revisar y probar antes de desplegarlos en producción. | Diferencia con MerqlMerql no es una herramienta de migración de esquemas. Fusiona datos de filas e informa de las columnas añadidas o eliminadas entre instantáneas; usted se encarga del cambio de esquema. |
Preguntas y respuestas
Respuestas breves de la documentación de Merql.
MySQL y SQLite, mediante los adaptadores PDO o mysqli. Para otro motor, escriba una clase que implemente la interfaz Driver y regístrela con DriverFactory::register().
No. No migra esquemas, replica bases de datos ni las sincroniza en tiempo real. A partir de tres estados de una base de datos, produce un cuarto estado fusionado e identifica los conflictos.
Cuando ambos lados cambian la misma columna de la misma fila a valores distintos, cuando un lado actualiza una fila que el otro eliminó o cuando ambos insertan una fila con la misma clave. Las ediciones en distintas columnas de una fila se fusionan sin conflictos.
No. Leen archivos de instantáneas guardados; solo se conectan a la base de datos al tomar una instantánea y aplicar un resultado.
Sí. Cree un plan de fusión, seleccione grupos de cambios mediante sus ID y convierta la selección en un resultado sin conflictos para Merql::apply() o Merql::applyGuarded().
Solo si opta por ello al crear ThreeWayMerge con un CellMergeConfig, como CellMergeConfig::auto(). Merql::merge(), Merql::plan() y la fachada CLI tratan cada valor de columna como un todo.
Siga la guía desde su primera instantánea hasta los planes de fusión, la aplicación protegida y la reversión.