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.
composer require merql/merqlVersão mais recente 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']);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.
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" }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.
| Ferramenta | Ideal para | Diferenças em relação a Merql |
|---|---|---|
| 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.
MySQL e SQLite, por meio dos adaptadores PDO ou mysqli. Para outro mecanismo, escreva uma classe que implemente a interface Driver e registre-a com DriverFactory::register().
Não. Ela não migra esquemas, replica bancos de dados nem os sincroniza em tempo real. Dado três estados do banco de dados, produz um quarto estado mesclado, identificando os conflitos.
Quando os dois lados alteram a mesma coluna da mesma linha para valores diferentes, quando um lado atualiza uma linha que o outro excluiu ou quando ambos inserem uma linha com a mesma chave. Alterações em colunas diferentes da mesma linha são mescladas sem problemas.
Não. Eles leem arquivos de instantâneos salvos, então somente a criação de um instantâneo e a aplicação de um resultado se conectam ao banco de dados.
Sim. Crie um plano de mesclagem, selecione grupos de alterações pelos respectivos IDs e transforme a seleção em um resultado limpo para Merql::apply() ou Merql::applyGuarded().
Somente se você optar por isso ao construir ThreeWayMerge com um CellMergeConfig, como CellMergeConfig::auto(). Merql::merge(), Merql::plan() e o CLI tratam cada valor de coluna como um todo.
Siga o guia desde o primeiro instantâneo até os planos de mesclagem, a aplicação protegida e a reversão.