
# Podgląd bez wykonywania

`DryRun::generate()` tworzy czytelne dla człowieka instrukcje SQL z wartościami wstawionymi bezpośrednio do treści. Użyj go, aby sprawdzić, co zrobiłoby scalanie, zanim zastosujesz je do bazy danych.

```php
use Merql\Apply\DryRun;

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

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

Podgląd zawiera instrukcję dla każdej operacji w wyniku, pogrupowane tak, jak robi to `Applier`: najpierw wstawianie, potem aktualizacje, a na końcu usuwanie. Pełny wynik scalania obejmuje każdą zmianę obu stron względem podstawy, czyli wszystko, co `Merql::apply()` wykonałoby na bazie danych, która nadal zawiera stan podstawowy. Wyświetl podgląd [wybranego wyniku](https://merql.inline0.dev/pl/docs/merge/plans), aby zobaczyć tylko instrukcje dotyczące operacji, które planujesz zastosować.

## Przykładowe wyjście

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

Aktualizacje ustawiają wszystkie przenoszone przez operację kolumny niebędące kolumnami identyfikacyjnymi, a nie tylko te zmienione. Aktualizacja, która nie ustawiłaby żadnej kolumny, jest pomijana.

## Formatowanie wartości

Wszystkie wartości są ujęte w pojedyncze cudzysłowy. Znaki specjalne są zabezpieczane przez zastępowanie:

| Znak | Zapis po ucieczce |
|---|---|
| `\` (ukośnik odwrotny) | `\\` |
| `'` (pojedynczy cudzysłów) | `''` |
| `\0` (bajt zerowy) | `\0` |
| `\n` (znak nowej linii) | `\n` |
| `\r` (powrót karetki) | `\r` |

Wartości NULL są wyświetlane jako literał `NULL` bez cudzysłowów:

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

## Parametry

`DryRun::generate()` przyjmuje te same parametry co `SqlGenerator::generate()`:

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

| Parametr | Typ | Opis |
|---|---|---|
| `$result` | `MergeResult` | Wynik scalania do wyświetlenia w podglądzie. |
| `$base` | `?Snapshot` | Zrzut podstawowy dla kolumn identyfikacyjnych. Domyślnie używany jest `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Mapa zależności kluczy obcych używana do ustalania kolejności. |
| `$driver` | `?Driver` | Sterownik bazy danych służący do cytowania identyfikatorów. |

## Podgląd bez wykonywania a SqlGenerator

`DryRun` stanowi nakładkę na `SqlGenerator`. Różnica:

- `SqlGenerator::generate()` zwraca tablice `['sql' => '...', 'params' => [...]]` przeznaczone do wykonywania przez adapter za pomocą przygotowanych zapytań.
- `DryRun::generate()` zwraca płaskie ciągi z wstawionymi wartościami, przeznaczone do odczytu przez człowieka.

Nie wykonuj wyniku podglądu bez wykonywania jako SQL. Służy on do wyświetlania, a nie do bezpiecznego wykonywania. Do wykonywania scaleń używaj bezpośrednio `Applier` lub `SqlGenerator` z przygotowanymi zapytaniami.

## Korzystanie z fasady

Przechwyć wynik scalania za pośrednictwem fasady i wyświetl jego podgląd:

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

Lub za pośrednictwem CLI z flagą `--dry-run`:

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

CLI wyświetla instrukcje bez ustalania kolejności według kluczy obcych ani sterownika, dlatego identyfikatory są cytowane domyślnymi znakami odwrotnego apostrofu niezależnie od bazy danych. Przekazuje podstawowy zrzut dla kolumn identyfikacyjnych. Scalanie odbywa się na poziomie kolumn, tak jak w `Merql::merge()`.
