
# Aperçu de l'exécution à blanc

`DryRun::generate()` produit des instructions SQL lisibles, avec les valeurs insérées directement. Utilisez-le pour examiner les effets d'une fusion avant de l'appliquer à la base de données.

```php
use Merql\Apply\DryRun;

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

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

L'aperçu contient une instruction pour chaque opération du résultat, regroupées comme dans `Applier` : insertions, puis mises à jour, puis suppressions. Le résultat complet d'une fusion comprend toutes les modifications apportées par les deux côtés par rapport à la base ; ce sont celles que `Merql::apply()` exécuterait sur une base de données contenant toujours la base. Prévisualisez un [résultat sélectionné](https://merql.inline0.dev/fr/docs/merge/plans) pour ne voir que les instructions correspondant aux opérations que vous prévoyez d'appliquer.

## Exemple de sortie

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

Les mises à jour définissent toutes les colonnes autres que celles d'identité transportées par l'opération, et pas seulement celles qui ont changé ; une mise à jour qui ne définirait aucune colonne est omise.

## Formatage des valeurs

Toutes les valeurs sont entourées de guillemets simples. Les caractères spéciaux sont échappés pour un affichage sûr :

| Caractère | Forme échappée |
|---|---|
| `\` (barre oblique inverse) | `\\` |
| `'` (guillemet simple) | `''` |
| `\0` (octet nul) | `\0` |
| `\n` (saut de ligne) | `\n` |
| `\r` (retour chariot) | `\r` |

Les valeurs NULL sont affichées sous la forme du littéral `NULL` sans guillemets :

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

## Paramètres

`DryRun::generate()` accepte les mêmes paramètres que `SqlGenerator::generate()` :

```php
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
```

| Paramètre | Type | Description |
|---|---|---|
| `$result` | `MergeResult` | Le résultat de fusion à prévisualiser. |
| `$base` | `?Snapshot` | Instantané de base pour les colonnes d'identité. Valeur par défaut : `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Correspondance des dépendances entre clés étrangères pour l'ordonnancement. |
| `$driver` | `?Driver` | Pilote de base de données pour citer les identifiants. |

## Exécution à blanc ou SqlGenerator

`DryRun` enveloppe `SqlGenerator`. La différence :

- `SqlGenerator::generate()` renvoie des tableaux `['sql' => '...', 'params' => [...]]` destinés à l'exécution par un adaptateur avec des instructions préparées.
- `DryRun::generate()` renvoie des chaînes simples où les valeurs sont insérées, conçues pour être lues par des personnes.

N'exécutez pas la sortie de l'exécution à blanc comme SQL. Elle est formatée pour l'affichage et n'est pas sûre à exécuter. Pour exécuter des fusions, utilisez directement `Applier` ou `SqlGenerator` avec des instructions préparées.

## Utiliser la façade

Avec la façade, capturez un résultat de fusion et prévisualisez-le :

```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 depuis CLI avec l'option `--dry-run` :

```bash
vendor/bin/merql merge base ours theirs --dry-run
```

CLI affiche les instructions sans ordre des clés étrangères ni pilote ; les identifiants utilisent donc les accents graves par défaut, quel que soit le moteur de base de données. Il transmet l'instantané de base pour les colonnes d'identité. Sa fusion est au niveau des colonnes, comme `Merql::merge()`.
