Merql
دمج ثلاثي الاتجاهات لقواعد البيانات باستخدام PHP، مع حل تعارضات على مستوى الأعمدة. دلالات دمج شبيهة بـ Git لجداول MySQL وSQLite.
composer require merql/merqlأحدث إصدار v0.4.1 MIT PHP 8.2+
use Merql\Merql;
Merql::init($connection);
// Snapshot all tables.
$snapshot = Merql::snapshot('baseline');
// Snapshot specific tables.
$snapshot = Merql::snapshot('baseline', ['posts', 'comments', 'users']);في التطبيق العملي
تقرأ عملية الدمج ثلاث لقطات محفوظة وتُرجع العمليات المطلوب كتابتها والتعارضات المطلوب حلها.
دمج ثلاث لقطات
التقط اللقطة الأساسية قبل أن تتفرع النسختان، ثم التقط لقطة لكل جانب، مثل قاعدة بيانات مباشرة ونسخة اختبارية. يقارن ThreeWayMerge كلا الجانبين باللقطة الأساسية ويدمج مجموعتي التغييرات.
في تبويب النتيجة، عدّلنا content، وعدّلوا title وstatus في الصف نفسه، لذا يحتفظ الدمج بالتعديلات الثلاثة كلها دون تعارض.
use Merql\Merge\ThreeWayMerge;
$merge = new ThreeWayMerge();
$result = $merge->merge($base, $ours, $theirs);
echo $result->operationCount(); // resolved operations
echo $result->conflictCount(); // unresolved conflictsBase: { title: "Hello", content: "Body", status: "draft" }
Ours: { title: "Hello", content: "Body v2", status: "draft" }
Theirs: { title: "New Title", content: "Body", status: "publish" }
Result: { title: "New Title", content: "Body v2", status: "publish" }الدمج ثلاثي الاتجاهات
Base وours وtheirs. دمج ثلاثي الاتجاهات بأسلوب git للصفوف والأعمدة ذات المفاتيح بدلًا من الأسطر. يكتشف عمليات الإدراج والتحديث والحذف عبر فرعين.
حل على مستوى الأعمدة
عندما يغيّر الطرفان الصف نفسه، يقارن merql الأعمدة واحدًا تلو الآخر. ولا يظهر تعارض إلا إذا غيّر الطرفان العمود نفسه إلى قيمتين مختلفتين.
دمج الخلايا اختياريًا
مرّر CellMergeConfig إلى ThreeWayMerge لدمج أعمدة TEXT سطرًا بسطر باستخدام فرق Myers، وأعمدة JSON مفتاحًا بمفتاح. لا تفعّله الواجهة الموحدة Merql ولا CLI.
قواعد بيانات متعددة
محولات اتصال قابلة للتوسعة وبرامج تشغيل للهجات، مع دعم مدمج لـ MySQL وSQLite.
اكتشاف التعارضات
تحديث مقابل تحديث، وتحديث مقابل حذف، وحذف مقابل تحديث، وإدراج مقابل إدراج؛ يُبلّغ عن كل حالة مع الجدول والصف. كما تُسمّي تعارضات التحديث مقابل التحديث العمود.
إنشاء SQL
عبارات INSERT وUPDATE وDELETE ذات معاملات مرتبة مع مراعاة المفاتيح الخارجية. معاينة تشغيل جاف أو تطبيق ضمن معاملة.
CLI
التقط لقطات واكتشف الفروق وادمج من سطر الأوامر. يدعم MySQL وSQLite عبر متغيرات البيئة.
مختبَر
32 سيناريو تراجع بتوقعات مكتوبة يدويًا (composer test:oracle). يشغّل CI عدد 231 اختبارًا للوحدات والتكامل وPHPStan بالمستوى 10.
لماذا Merql؟
اللقطات ملفات
كل لقطة ملف JSON يمكنك نسخه بين الأجهزة أو إيداعه في نظام التحكم بالإصدارات. تقرأ عمليتا المقارنة والدمج هذه الملفات، لذا تعملان دون اتصال بقاعدة بيانات.
راجع قبل الكتابة
تمنح خطة الدمج كل عملية ومجموعة تغييرات معرّفًا ثابتًا، وتحتفظ بصفوف الأساس وصفوفنا وصفوفهم وصفوف النتيجة. اختر المجموعات التي تريدها وطبّقها وحدها.
تتوقف الخطط القديمة
لا تكتب عملية التطبيق المحمي إلا في الصفوف التي ما زالت تطابق اللقطة التي راجعتها. إذا لم يؤثر الاستعلام في أي صف، تُلغى المعاملة وتُرفق النتيجة بالخطأ.
التراجع مع التحقق من الانحراف
أنشئ خطة تراجع من الصفوف المباشرة قبل الكتابة مباشرةً واحفظها بصيغة JSON. قبل التراجع، يقارن فحص الانحراف بصمات الصفوف ويُرجع العمليات التي تغيّرت صفوفها منذ ذلك الحين.
مقارنة مع
يدمج Merql بيانات الصفوف من ثلاث لقطات. أما هذه الأدوات فتُصدر إصدارات قواعد البيانات أو تزامنها أو ترحّلها، وهي مهام مجاورة.
| الأداة | مناسب لـ | الاختلاف عن Merql |
|---|---|---|
| Dolt | مناسب لـDolt قاعدة بيانات SQL يمكنك تفرّعها واستنساخها وإنشاء فروع لها ودمجها ودفع التغييرات إليها وسحبها، مثل مستودع Git. تتصل بها كما تتصل بأي قاعدة بيانات MySQL، وتتتبع تسلسل كل خلية. | الاختلاف عن Merqlيُبقي Merql على قاعدة بيانات MySQL أو SQLite التي تستخدمها بالفعل. ويحفظ الجداول في ملفات لقطات JSON ويدمج ثلاثًا منها، مع اختيارك للّقطة الأساسية. |
| pt-table-sync | مناسب لـتعثر pt-table-sync على الاختلافات بين جداول MySQL وتصلحها، في اتجاه واحد أو في الاتجاهين بين الخوادم. وعند مزامنة نسخة متماثلة، تُجري التغييرات على مصدر النسخ المتماثل. | الاختلاف عن Merqlفي المزامنة ثنائية الاتجاه، تختار pt-table-sync الصف الفائز استنادًا إلى عمود التعارض وتنسخ قيمه. يقارن Merql الجانبين بقاعدة مشتركة، ويدمج التعديلات على أعمدة مختلفة من الصف نفسه، ويعرض التغييرات غير المتوافقة كتعارضات لتحلها. |
| sqldiff | مناسب لـتقارن sqldiff قاعدتي بيانات SQLite وتطبع برنامجًا نصيًا SQL يحوّل الأولى إلى الثانية. ويمكنها أيضًا كتابة مجموعة تغييرات ثنائية لامتداد جلسات SQLite أو تلخيص الصفوف المتغيرة لكل جدول. | الاختلاف عن Merqlلا تستطيع المقارنة ثنائية الاتجاه تحديد ما إذا كان أحد الجانبين قد أضاف صفًا أم أن الجانب الآخر حذفه. يضيف Merql لقطة أساسية لتحديد ذلك، ويدمج مجموعتي تغييرات، كما يعمل مع MySQL. |
| Doctrine Migrations | مناسب لـتُصدر Doctrine Migrations إصدارات لمخطط قاعدة بياناتك، لتتمكن من مراجعة تغييرات المخطط واختبارها قبل نشرها في بيئة الإنتاج. | الاختلاف عن MerqlMerql ليس أداة لترحيل المخطط. فهو يدمج بيانات الصفوف ويعرض الأعمدة المضافة أو المحذوفة بين اللقطات، ويترك لك إجراء تغيير المخطط. |
الأسئلة والأجوبة
إجابات موجزة من توثيق Merql.
يعمل مع MySQL وSQLite عبر موائمات PDO أو mysqli. لاستخدام محرك آخر، اكتب فئة تنفذ واجهة Driver وسجّلها في DriverFactory::register().
لا. فهو لا يرحّل المخططات ولا ينسخ قواعد البيانات متماثلًا ولا يزامنها في الوقت الفعلي. عند تزويده بثلاث حالات لقاعدة البيانات، ينتج حالة رابعة مدمجة مع تحديد التعارضات.
عندما يغيّر الجانبان العمود نفسه في الصف نفسه إلى قيمتين مختلفتين، أو عندما يحدّث أحد الجانبين صفًا يحذفه الآخر، أو عندما يُدرج كلاهما صفًا بالمفتاح نفسه. تُدمج التعديلات على أعمدة مختلفة في الصف الواحد بسلاسة.
لا. فهما يقرآن ملفات اللقطات المحفوظة، لذا لا يتصل بقاعدة البيانات إلا أخذ لقطة وتطبيق نتيجة.
نعم. أنشئ خطة دمج، واختر مجموعات التغييرات حسب معرّفاتها، ثم حوّل اختيارك إلى نتيجة سليمة لـMerql::apply() أو Merql::applyGuarded().
فقط إذا اخترت ذلك عند إنشاء ThreeWayMerge باستخدام CellMergeConfig، مثل CellMergeConfig::auto(). تتعامل Merql::merge() وMerql::plan() وCLI مع قيمة كل عمود بوصفها وحدة كاملة.
اتبع الدليل بدءًا من لقطتك الأولى، مرورًا بخطط الدمج والتطبيق المحمي، وصولًا إلى التراجع.