Pular para o conteúdo

Merql

Mesclagem pura de bancos de dados em três vias em PHP, com resolução de conflitos por coluna. Semântica de mesclagem no estilo Git aplicada a tabelas MySQL e SQLite.

Terminal
composer require merql/merql

Versão mais recente v0.4.1 MIT PHP 8.2+

Na prática

Uma mesclagem lê três snapshots salvos e retorna as operações a gravar e os conflitos a resolver.

Mescle três snapshots

Crie o snapshot da base antes que as duas cópias divirjam e, em seguida, tire um snapshot de cada lado, por exemplo, de um banco de dados em produção e de uma cópia de sandbox. ThreeWayMerge compara os dois lados com a base e mescla os dois conjuntos de alterações.

Na aba de resultados, ours editou content e theirs editou title e status da mesma linha; assim, a mesclagem mantém as três edições sem conflitos.

PHP
use Merql\Merge\ThreeWayMerge;

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

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

Mesclagem de três vias

Base, a nossa versão e a versão deles. Mesclagem em três vias no estilo git de linhas identificadas por chaves e suas colunas, em vez de linhas de texto. Detecta inserções, atualizações e exclusões entre dois branches.

Resolução no nível da coluna

Quando os dois lados alteram a mesma linha, merql compara cada coluna. Só há conflito quando a mesma coluna recebe valores diferentes.

Mesclagem de células opcional

Passe um CellMergeConfig para ThreeWayMerge e as colunas TEXT serão mescladas linha por linha com a diferença de Myers, e as colunas JSON, chave por chave. A facade Merql e o CLI não ativam esse recurso.

Vários bancos de dados

Adaptadores de conexão e drivers de dialeto conectáveis, com MySQL e SQLite integrados.

Detecção de conflitos

Atualização contra atualização, atualização contra exclusão, exclusão contra atualização e inserção contra inserção: cada conflito é relatado com a tabela e a linha. Os conflitos entre atualizações também identificam a coluna.

Geração de SQL

Instruções INSERT, UPDATE e DELETE parametrizadas, ordenadas com base nas chaves estrangeiras. Pré-visualize sem executar ou aplique em uma transação.

CLI

Crie snapshots, compare e mescle pela linha de comando. Compatível com MySQL e SQLite por meio de variáveis de ambiente.

Testado

32 cenários de regressão com resultados esperados escritos manualmente (composer test:oracle). A CI executa 231 testes unitários e de integração e o nível 10 de PHPStan.

Por que Merql

Snapshots são arquivos

Cada snapshot é um arquivo JSON que você pode copiar entre máquinas ou enviar para o controle de versão. A comparação e a mesclagem leem esses arquivos, então são executadas sem conexão com o banco de dados.

Revise antes de gravar

Um plano de mesclagem atribui a cada operação e grupo de alterações um ID estável e mantém as linhas da base, de ours, de theirs e do resultado. Selecione os grupos desejados e aplique apenas esses.

Planos obsoletos são interrompidos

A aplicação protegida grava apenas em linhas que ainda correspondem ao snapshot revisado. Se uma instrução afetar zero linhas, a transação será revertida e o resultado conterá o erro.

Reversão com verificação de divergências

Crie um plano de reversão a partir das linhas ativas imediatamente antes da gravação e armazene-o como JSON. Antes de desfazer, a verificação de divergências compara as impressões digitais das linhas e retorna as operações cujas linhas foram alteradas desde então.

Comparação com

Merql mescla dados de linhas de três snapshots. Estas ferramentas controlam versões, sincronizam ou migram bancos de dados; são voltadas a tarefas relacionadas.

Merql em comparação com outras ferramentas
Dolt Ideal paraDolt é um banco de dados SQL que você pode bifurcar, clonar, criar branches, mesclar, enviar e baixar, como um repositório Git. Você se conecta a ele como a qualquer banco de dados MySQL, e ele acompanha a linhagem de cada célula. Diferenças em relação a MerqlMerql mantém o banco de dados MySQL ou SQLite que você já usa. Ele salva tabelas como arquivos de snapshot JSON e mescla três deles, com o snapshot da base escolhido por você.
pt-table-sync Ideal parapt-table-sync encontra e corrige diferenças entre tabelas MySQL, em uma direção ou nas duas, entre servidores. Ao sincronizar uma réplica, aplica as alterações na origem da replicação. Diferenças em relação a MerqlEm uma sincronização bidirecional, pt-table-sync escolhe uma linha vencedora com base em uma coluna de conflito e copia seus valores. Merql compara os dois lados com uma base comum, mescla edições feitas em colunas diferentes da mesma linha e relata alterações incompatíveis como conflitos para você resolver.
sqldiff Ideal parasqldiff compara dois bancos de dados SQLite e imprime um script SQL que transforma o primeiro no segundo. Também pode gravar um conjunto binário de alterações para a extensão de sessão SQLite ou resumir as linhas alteradas por tabela. Diferenças em relação a MerqlUm diff de duas vias não consegue dizer se um lado adicionou uma linha ou se o outro a excluiu. Merql adiciona um instantâneo de base para responder a isso, mescla dois conjuntos de alterações e também funciona com MySQL.
Doctrine Migrations Ideal paraDoctrine Migrations versiona o esquema do banco de dados para que as alterações no esquema possam ser revisadas e testadas antes de serem implantadas em produção. Diferenças em relação a MerqlMerql não é uma ferramenta de migração de esquemas. Ela mescla dados de linhas e informa quais colunas foram adicionadas ou removidas entre instantâneos, deixando a alteração do esquema por sua conta.

Perguntas e respostas

Respostas curtas da documentação do Merql.

Siga o guia desde o primeiro instantâneo até os planos de mesclagem, a aplicação protegida e a reversão.