انتقل إلى المحتوى

معاينة التشغيل التجريبي

ينشئ 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 العبارات من دون ترتيب حسب المفاتيح الخارجية أو برنامج تشغيل، لذا تُقتبس المعرّفات بعلامات backtick افتراضيًا، أيًا كانت قاعدة البيانات. وتمرر لقطة الأساس لأعمدة الهوية. ودمجها على مستوى الأعمدة، مثل Merql::merge().