
# Forhåndsvisning af prøvekørsel

`DryRun::generate()` genererer menneskeligt læsbare SQL-sætninger med værdier indsat direkte. Brug den til at gennemgå, hvad en sammenfletning vil gøre, før den anvendes på databasen.

```php
use Merql\Apply\DryRun;

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

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

Forhåndsvisningen indeholder en sætning for hver operation i resultatet, grupperet på samme måde, som `Applier` grupperer dem: indsættelser, derefter opdateringer og til sidst sletninger. Det fulde resultat af en sammenfletning omfatter alle ændringer fra begge sider i forhold til base, og det er dem, `Merql::apply()` ville udføre på en database, der stadig indeholder base. Se en [valgt resultat](https://merql.inline0.dev/da/docs/merge/plans) for kun at få vist sætningerne for de operationer, du planlægger at anvende.

## Eksempel på output

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

Opdateringer angiver alle ikke-identitetskolonner, som operationen indeholder, ikke kun de ændrede kolonner. En opdatering, der ikke ville angive nogen kolonner, udelades.

## Værdiformatering

Alle værdier omsluttes af enkelte anførselstegn. Specialtegn escapes, så de vises sikkert:

| Tegn | Escapes som |
|---|---|
| `\` (omvendt skråstreg) | `\\` |
| `'` (enkelt anførselstegn) | `''` |
| `\0` (null-byte) | `\0` |
| `\n` (linjeskift) | `\n` |
| `\r` (vognretur) | `\r` |

NULL-værdier vises som den uanførte bogstavelige værdi `NULL`:

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

## Parametre

`DryRun::generate()` accepterer de samme parametre som `SqlGenerator::generate()`:

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

| Parameter | Type | Beskrivelse |
|---|---|---|
| `$result` | `MergeResult` | Det sammenfletningsresultat, der skal forhåndsvises. |
| `$base` | `?Snapshot` | Basesnapshot for identitetskolonner. Falder tilbage til `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Afhængighedskort over fremmednøgler til rækkefølgen. |
| `$driver` | `?Driver` | Databasedriver til citering af identifikatorer. |

## Prøvekørsel kontra SqlGenerator

`DryRun` omslutter `SqlGenerator`. Forskellen:

- `SqlGenerator::generate()` returnerer `['sql' => '...', 'params' => [...]]`-arrays, der er beregnet til udførelse af forberedte adapter-sætninger.
- `DryRun::generate()` returnerer flade strenge med værdier indsat direkte, beregnet til at blive læst af mennesker.

Udfør ikke output fra prøvekørslen som SQL. Det er formateret til visning, ikke til sikker udførelse. Brug `Applier` eller `SqlGenerator` direkte med forberedte sætninger til at udføre sammenfletninger.

## Brug via facaden

Registrer et sammenfletningsresultat via facaden, og se en forhåndsvisning af det:

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

Eller fra CLI med flaget `--dry-run`:

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

CLI udskriver sætningerne uden rækkefølge efter fremmednøgler eller en driver, så identifikatorer bruger standardcitering med backticks uanset database. Den sender basesnapshot med for identitetskolonner. Sammenfletningen sker på kolonneniveau som i `Merql::merge()`.
