Перейти к содержимому

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

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

PHP
use Merql\Apply\DryRun;

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

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

Предварительный просмотр содержит инструкцию для каждой операции в результате, сгруппированные так же, как их группирует Applier: сначала вставки, затем обновления, потом удаления. Полный результат слияния включает все изменения обеих сторон относительно базовой версии — именно их Merql::apply() выполнил бы для базы данных, в которой по-прежнему хранится базовая версия. Предварительно просмотрите выбранный результат, чтобы увидеть только инструкции для операций, которые вы планируете применить.

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

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:

Командная оболочка
vendor/bin/merql merge base ours theirs --dry-run

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