Saltar al contenido

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.

Terminal
composer require merql/merql

Última versión v0.4.1 MIT PHP 8.2+

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.

PHP
use Merql\Merge\ThreeWayMerge;

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

echo $result->operationCount(); // resolved operations
echo $result->conflictCount();  // unresolved conflicts

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.

Merql en comparación con otras herramientas
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.

Siga la guía desde su primera instantánea hasta los planes de fusión, la aplicación protegida y la reversión.