
# Förhandsgranskning av torrkörning

`DryRun::generate()` genererar människoläsbara SQL-satser med värden infogade direkt i texten. Använd den för att granska vad en sammanslagning skulle göra innan den tillämpas på databasen.

```php
use Merql\Apply\DryRun;

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

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

Förhandsgranskningen innehåller en sats för varje åtgärd i resultatet, grupperade på samma sätt som `Applier` grupperar dem: infogningar, sedan uppdateringar och därefter borttagningar. För hela sammanslagningsresultatet omfattar det alla ändringar från båda sidorna i förhållande till basen, alltså allt som `Merql::apply()` skulle köra mot en databas som fortfarande innehåller basen. Förhandsgranska ett [valt resultat](https://merql.inline0.dev/sv/docs/merge/plans) för att endast se satserna för de åtgärder du planerar att tillämpa.

## Exempel på utdata

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

Uppdateringar anger alla kolumner som inte är identitetskolumner och som åtgärden innehåller, inte bara de ändrade kolumnerna. En uppdatering som inte skulle ange någon kolumn utelämnas.

## Värdeformatering

Alla värden omges av enkla citattecken. Specialtecken escape:as för säker visning:

| Tecken | Escapas som |
|---|---|
| `\` (omvänt snedstreck) | `\\` |
| `'` (enkelt citattecken) | `''` |
| `\0` (nullbyte) | `\0` |
| `\n` (radbrytning) | `\n` |
| `\r` (vagnretur) | `\r` |

NULL-värden återges som den ociterade bokstavliga konstanten `NULL`:

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

## Parametrar

`DryRun::generate()` godtar samma parametrar som `SqlGenerator::generate()`:

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

| Parameter | Typ | Beskrivning |
|---|---|---|
| `$result` | `MergeResult` | Sammanslagningsresultatet att förhandsgranska. |
| `$base` | `?Snapshot` | Basögonblicksbild för identitetskolumner. Använder `$result->baseSnapshot()` som reserv. |
| `$fkDependencies` | `array` | Beroendekarta för främmande nycklar som styr ordningen. |
| `$driver` | `?Driver` | Databasdrivrutin för citering av identifierare. |

## Torrkörning jämfört med SqlGenerator

`DryRun` omsluter `SqlGenerator`. Skillnaden:

- `SqlGenerator::generate()` returnerar `['sql' => '...', 'params' => [...]]`-arrayer avsedda för körning med adapterns förberedda satser.
- `DryRun::generate()` returnerar platta strängar med värden infogade direkt, avsedda för människor att läsa.

Kör inte utdata från torrkörningen som SQL. Den är formaterad för visning, inte för säker körning. Använd `Applier` eller `SqlGenerator` direkt med förberedda satser för att köra sammanslagningar.

## Användning med fasaden

Samla in ett sammanslagningsresultat via fasaden och förhandsgranska 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 från CLI med flaggan `--dry-run`:

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

CLI skriver ut satserna utan ordning efter främmande nycklar eller drivrutin, så identifierare använder standardcitering med omvända apostrofer oavsett databas. Den skickar med basögonblicksbilden för identitetskolumner. Dess sammanslagning sker på kolumnnivå, precis som `Merql::merge()`.
