Попередній перегляд без виконання
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().