
# Voorbeeld van een dry run

`DryRun::generate()` genereert voor mensen leesbare SQL-instructies met de waarden inline ingevuld. Gebruik deze om te bekijken wat een samenvoeging zou doen voordat u die op de database toepast.

```php
use Merql\Apply\DryRun;

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

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

De preview bevat voor elke bewerking in het resultaat een instructie, gegroepeerd zoals `Applier` ze groepeert: eerst inserts, dan updates en vervolgens deletes. Voor het volledige resultaat van een samenvoeging zijn dat alle wijzigingen van beide kanten ten opzichte van de basis; die zou `Merql::apply()` uitvoeren op een database die de basis nog bevat. Bekijk een [geselecteerd resultaat](https://merql.inline0.dev/nl/docs/merge/plans) om alleen de instructies te zien voor de bewerkingen die u wilt toepassen.

## Voorbeeld van uitvoer

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

Updates stellen elke niet-identiteitskolom in die de bewerking bevat, niet alleen de gewijzigde kolommen. Een update die geen kolom zou instellen, wordt weggelaten.

## Waarden opmaken

Alle waarden staan tussen enkele aanhalingstekens. Speciale tekens worden veilig weergegeven door ze te escapen:

| Teken | Geëscapet als |
|---|---|
| `\` (backslash) | `\\` |
| `'` (enkel aanhalingsteken) | `''` |
| `\0` (null-byte) | `\0` |
| `\n` (nieuwe regel) | `\n` |
| `\r` (regeleinde) | `\r` |

NULL-waarden worden weergegeven als de niet-gequote letterlijke waarde `NULL`:

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

## Parameters

`DryRun::generate()` accepteert dezelfde parameters als `SqlGenerator::generate()`:

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

| Parameter | Type | Beschrijving |
|---|---|---|
| `$result` | `MergeResult` | Het samenvoegingsresultaat dat u wilt bekijken. |
| `$base` | `?Snapshot` | Basissnapshot voor identiteitskolommen. Valt terug op `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Afhankelijkheidskaart van foreign keys voor de volgorde. |
| `$driver` | `?Driver` | Databasedriver voor het citeren van identifiers. |

## Dry run versus SqlGenerator

`DryRun` bouwt voort op `SqlGenerator`. Het verschil:

- `SqlGenerator::generate()` retourneert `['sql' => '...', 'params' => [...]]`-arrays voor uitvoering met prepared statements van de adapter.
- `DryRun::generate()` retourneert platte strings met inline ingevulde waarden, bedoeld om door mensen te worden gelezen.

Voer de uitvoer van een dry run niet uit als SQL. Deze is opgemaakt voor weergave, niet voor veilige uitvoering. Gebruik voor het uitvoeren van samenvoegingen rechtstreeks `Applier` of `SqlGenerator` met prepared statements.

## De facade gebruiken

Leg via de facade een samenvoegingsresultaat vast en bekijk een preview:

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

Of gebruik de CLI met de vlag `--dry-run`:

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

De CLI geeft de instructies weer zonder foreign key-volgorde of driver, waardoor identifiers standaard met backticks worden geciteerd, ongeacht de database. De basissnapshot wordt meegegeven voor identiteitskolommen. De samenvoeging werkt op kolomniveau, net als `Merql::merge()`.
