Vista previa de ejecución en seco
DryRun::generate() genera instrucciones SQL legibles, con los valores insertados en línea. Úselo para revisar lo que haría una combinación antes de aplicarla a la base de datos.
use Merql\Apply\DryRun;
$statements = DryRun::generate($result);
foreach ($statements as $sql) {
echo "{$sql};\n";
}
La vista previa contiene una instrucción por cada operación del resultado, agrupadas como las agrupa Applier: primero las inserciones, luego las actualizaciones y, por último, las eliminaciones. El resultado completo de una combinación incluye todos los cambios de ambos lados con respecto a la base, que es lo que Merql::apply() ejecutaría en una base de datos que aún conserva la base. Previsualice un resultado seleccionado para ver solo las instrucciones de las operaciones que tiene previsto aplicar.
Ejemplo de salida
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';
Las actualizaciones establecen todas las columnas que contiene la operación, excepto las de identidad, no solo las que han cambiado; se omite una actualización que no establecería ninguna columna.
Formato de los valores
Todos los valores se encierran entre comillas simples. Los caracteres especiales se escapan para mostrarlos de forma segura:
| Carácter | Se escapa como |
|---|---|
\ (barra invertida) |
\\ |
' (comilla simple) |
'' |
\0 (byte nulo) |
\0 |
\n (salto de línea) |
\n |
\r (retorno de carro) |
\r |
Los valores NULL se representan como el literal sin comillas NULL:
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
Parámetros
DryRun::generate() acepta los mismos parámetros que SqlGenerator::generate():
$statements = DryRun::generate(
$result,
base: $baseSnapshot,
fkDependencies: ['comments' => ['posts']],
driver: new SqliteDriver(),
);
| Parámetro | Tipo | Descripción |
|---|---|---|
$result |
MergeResult |
El resultado de combinación que se previsualizará. |
$base |
?Snapshot |
Instantánea base para las columnas de identidad. Si no se proporciona, se usa $result->baseSnapshot(). |
$fkDependencies |
array |
Mapa de dependencias de claves externas para ordenar. |
$driver |
?Driver |
Controlador de base de datos para entrecomillar identificadores. |
Ejecución en seco y SqlGenerator
DryRun envuelve SqlGenerator. Diferencias:
SqlGenerator::generate()devuelve matrices['sql' => '...', 'params' => [...]]pensadas para ejecutarlas mediante instrucciones preparadas del adaptador.DryRun::generate()devuelve cadenas planas con los valores insertados, pensadas para que las lean las personas.
No ejecute la salida de la ejecución en seco como SQL. Está formateada para mostrarse, no para ejecutarse de forma segura. Para ejecutar combinaciones, use Applier o SqlGenerator directamente con instrucciones preparadas.
Uso con la fachada
Capture un resultado de combinación mediante la fachada y previsualícelo:
use Merql\Merql;
use Merql\Apply\DryRun;
$result = Merql::merge('base', 'ours', 'theirs');
$statements = DryRun::generate($result);
foreach ($statements as $sql) {
echo "{$sql};\n";
}
También puede usar CLI con la opción --dry-run:
vendor/bin/merql merge base ours theirs --dry-run
CLI imprime las instrucciones sin ordenar por claves externas ni usar un controlador, por lo que emplea el entrecomillado predeterminado con comillas invertidas para los identificadores, sea cual sea la base de datos. Pasa la instantánea base para las columnas de identidad. Su combinación es a nivel de columna, como Merql::merge().