
# Végrehajtás nélküli előnézet

A `DryRun::generate()` ember által olvasható SQL-utasításokat állít elő, amelyekben az értékek közvetlenül szerepelnek. Használatával még az adatbázis módosítása előtt áttekintheti, mit tenne az egyesítés.

```php
use Merql\Apply\DryRun;

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

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

Az előnézet az eredmény minden műveletéhez tartalmaz egy utasítást, az `Applier` csoportosítását követve: beszúrások, majd frissítések, végül törlések. Az egyesítés teljes eredményében ez az alaphoz képest mindkét oldalon történt összes változást jelenti, amelyeket a `Merql::apply()` hajtana végre egy olyan adatbázison, amely még az alapállapotot tartalmazza. A [kiválasztott eredmény](https://merql.inline0.dev/hu/docs/merge/plans) előnézetében csak az alkalmazni kívánt műveletek utasításait láthatja.

## Példakimenet

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

A frissítés a műveletben szereplő összes nem azonosító oszlopot beállítja, nem csupán a megváltozottakat; kimarad az a frissítés, amely egyetlen oszlopot sem állítana be.

## Értékek formázása

Minden érték egyszeres idézőjelek közé kerül. A speciális karaktereket a biztonságos megjelenítés érdekében escape-eli a rendszer:

| Karakter | Escape-elt alak |
|---|---|
| `\` (fordított perjel) | `\\` |
| `'` (egyszeres idézőjel) | `''` |
| `\0` (null bájt) | `\0` |
| `\n` (újsor) | `\n` |
| `\r` (kocsi-vissza) | `\r` |

A NULL értékek idézőjelek nélküli `NULL` literálként jelennek meg:

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

## Paraméterek

A `DryRun::generate()` ugyanazokat a paramétereket fogadja el, mint a `SqlGenerator::generate()`:

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

| Paraméter | Típus | Leírás |
|---|---|---|
| `$result` | `MergeResult` | Az előnézetben megjelenítendő egyesítési eredmény. |
| `$base` | `?Snapshot` | Az azonosító oszlopok alap-pillantképe. Ha nincs megadva, a rendszer az `$result->baseSnapshot()` értékét használja. |
| `$fkDependencies` | `array` | Az idegen kulcsok függőségi térképe a sorrend meghatározásához. |
| `$driver` | `?Driver` | Adatbázis-illesztőprogram azonosítók idézőjelezéséhez. |

## A végrehajtás nélküli futtatás és a SqlGenerator összevetése

A `DryRun` a `SqlGenerator` köré épül. A különbség:

- A `SqlGenerator::generate()` `['sql' => '...', 'params' => [...]]` tömböket ad vissza, amelyeket adapteres, előkészített utasításos végrehajtásra szántak.
- A `DryRun::generate()` lapos karakterláncokat ad vissza beillesztett értékekkel, emberi olvasásra.

Ne hajtsa végre a végrehajtás nélküli kimenetet SQL formájában. Megjelenítésre készült, nem biztonságos végrehajtásra. Egyesítések végrehajtásához közvetlenül a `Applier` vagy a `SqlGenerator` használja előkészített utasításokkal.

## Használat a homlokzaton keresztül

A homlokzaton keresztül rögzítse az egyesítési eredményt, majd tekintse meg az előnézetét:

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

Vagy a CLI felől, a `--dry-run` jelzővel:

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

A CLI illesztőprogram és idegenkulcs-sorrend nélkül írja ki az utasításokat, ezért az azonosítóknál az adatbázistól függetlenül az alapértelmezett backtick idézőjelezést használja. Átadja az alap pillanatképet az azonosító oszlopokhoz. Egyesítése oszlopszintű, akárcsak a `Merql::merge()`.
