Pular para o conteúdo

Prévia da execução de teste

DryRun::generate() gera instruções SQL legíveis por humanos, com os valores interpolados diretamente. Use-o para revisar o que uma mesclagem faria antes de aplicá-la ao banco de dados.

PHP
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}

A prévia contém uma instrução para cada operação no resultado, agrupadas da mesma forma que Applier as agrupa: inserções, depois atualizações e, por fim, exclusões. No resultado completo de uma mesclagem, isso inclui todas as alterações de ambos os lados em relação à base, que é o que Merql::apply() executaria em um banco de dados que ainda contém a base. Visualize um resultado selecionado para ver apenas as instruções das operações que você pretende aplicar.

Exemplo de saída

Sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';

As atualizações definem todas as colunas que a operação contém, exceto as colunas de identidade, e não apenas as alteradas. Uma atualização que não definiria nenhuma coluna é omitida.

Formatação de valores

Todos os valores são envolvidos por aspas simples. Os caracteres especiais são escapados para exibição segura:

Caractere Escapado como
\ (barra invertida) \\
' (aspas simples) ''
\0 (byte nulo) \0
\n (nova linha) \n
\r (retorno de carro) \r

Valores NULL são exibidos como o literal sem aspas NULL:

Sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';

Parâmetros

DryRun::generate() aceita os mesmos parâmetros que SqlGenerator::generate():

PHP
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
Parâmetro Tipo Descrição
$result MergeResult O resultado da mesclagem a visualizar.
$base ?Snapshot Snapshot base para colunas de identidade. Usa $result->baseSnapshot() como alternativa.
$fkDependencies array Mapa de dependências de chaves estrangeiras para ordenação.
$driver ?Driver Driver do banco de dados para delimitar identificadores.

Execução de teste vs. SqlGenerator

DryRun envolve SqlGenerator. A diferença:

  • SqlGenerator::generate() retorna arrays ['sql' => '...', 'params' => [...]] destinados à execução por prepared statements do adaptador.
  • DryRun::generate() retorna strings simples com valores inseridos diretamente, destinadas à leitura humana.

Não execute a saída da execução de teste como SQL. Ela é formatada para exibição, não para execução segura. Para executar mesclagens, use Applier ou SqlGenerator diretamente com prepared statements.

Usando com a fachada

Pela fachada, capture um resultado da mesclagem e visualize-o:

PHP
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}

Ou de CLI com a opção --dry-run:

Shell
vendor/bin/merql merge base ours theirs --dry-run

O CLI imprime as instruções sem ordenação por chave estrangeira nem driver, então os identificadores usam aspas invertidas por padrão, independentemente do banco de dados. Ele passa o snapshot base para colunas de identidade. Sua mesclagem é no nível da coluna, como Merql::merge().