
# 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.

```php
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](https://merql.inline0.dev/es/docs/merge/plans) para ver solo las instrucciones de las operaciones que tiene previsto aplicar.

## Ejemplo de salida

```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';
```

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`:

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

## Parámetros

`DryRun::generate()` acepta los mismos parámetros que `SqlGenerator::generate()`:

```php
$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:

```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";
}
```

También puede usar CLI con la opción `--dry-run`:

```bash
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()`.
