Перейти до вмісту

Попередній перегляд без виконання

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().