
# Предварительный просмотр без выполнения

`DryRun::generate()` формирует удобочитаемые инструкции SQL со встроенными значениями. Используйте его, чтобы проверить, что сделает слияние, прежде чем применять его к базе данных.

```php
use Merql\Apply\DryRun;

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

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

Предварительный просмотр содержит инструкцию для каждой операции в результате, сгруппированные так же, как их группирует `Applier`: сначала вставки, затем обновления, потом удаления. Полный результат слияния включает все изменения обеих сторон относительно базовой версии — именно их `Merql::apply()` выполнил бы для базы данных, в которой по-прежнему хранится базовая версия. Предварительно просмотрите [выбранный результат](https://merql.inline0.dev/ru/docs/merge/plans), чтобы увидеть только инструкции для операций, которые вы планируете применить.

## Пример вывода

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

При обновлении задаются все неидентификационные столбцы, которые содержит операция, а не только измененные. Обновление, которое не задает ни одного столбца, пропускается.

## Форматирование значений

Все значения заключаются в одинарные кавычки. Специальные символы экранируются для безопасного отображения:

| Символ | Экранированное представление |
|---|---|
| `\` (обратная косая черта) | `\\` |
| `'` (одинарная кавычка) | `''` |
| `\0` (нулевой байт) | `\0` |
| `\n` (перевод строки) | `\n` |
| `\r` (возврат каретки) | `\r` |

Значения NULL отображаются без кавычек как литерал `NULL`:

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

## Параметры

`DryRun::generate()` принимает те же параметры, что и `SqlGenerator::generate()`:

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

| Параметр | Тип | Описание |
|---|---|---|
| `$result` | `MergeResult` | Результат слияния для предварительного просмотра. |
| `$base` | `?Snapshot` | Базовый снимок для идентификационных столбцов. Если не указан, используется `$result->baseSnapshot()`. |
| `$fkDependencies` | `array` | Карта зависимостей внешних ключей для упорядочивания. |
| `$driver` | `?Driver` | Драйвер базы данных для заключения идентификаторов в кавычки. |

## Предварительный просмотр и SqlGenerator

`DryRun` — обертка над `SqlGenerator`. Разница:

- `SqlGenerator::generate()` возвращает массивы `['sql' => '...', 'params' => [...]]`, предназначенные для выполнения адаптером через подготовленные выражения.
- `DryRun::generate()` возвращает плоские строки со встроенными значениями, предназначенные для чтения человеком.

Не выполняйте вывод предварительного просмотра как SQL. Он отформатирован для отображения, а не для безопасного выполнения. Для выполнения слияний используйте `Applier` или `SqlGenerator` напрямую с подготовленными выражениями.

## Использование фасада

Получите результат слияния через фасад и просмотрите его:

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

Или из CLI с флагом `--dry-run`:

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

CLI выводит инструкции без упорядочивания по внешним ключам и без драйвера, поэтому идентификаторы заключаются в обратные кавычки по умолчанию независимо от базы данных. Для идентификационных столбцов передается базовый снимок. Слияние выполняется на уровне столбцов, как в `Merql::merge()`.
