Предварительный просмотр без выполнения
DryRun::generate() формирует удобочитаемые инструкции SQL со встроенными значениями. Используйте его, чтобы проверить, что сделает слияние, прежде чем применять его к базе данных.
use Merql\Apply\DryRun;
$statements = DryRun::generate($result);
foreach ($statements as $sql) {
echo "{$sql};\n";
}
Предварительный просмотр содержит инструкцию для каждой операции в результате, сгруппированные так же, как их группирует Applier: сначала вставки, затем обновления, потом удаления. Полный результат слияния включает все изменения обеих сторон относительно базовой версии — именно их Merql::apply() выполнил бы для базы данных, в которой по-прежнему хранится базовая версия. Предварительно просмотрите выбранный результат, чтобы увидеть только инструкции для операций, которые вы планируете применить.
Пример вывода
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:
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
Параметры
DryRun::generate() принимает те же параметры, что и SqlGenerator::generate():
$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 напрямую с подготовленными выражениями.
Использование фасада
Получите результат слияния через фасад и просмотрите его:
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().