
اقتراح لـ SQLite: أمر pragma واحد لإصلاح أربعة إعدادات افتراضية سيئة
تجادل تدوينة بأن الإعدادات الافتراضية في SQLite — مفاتيح خارجية معطّلة، وغياب تنسيق صارم للأنواع، وأخطاء SQLITE_BUSY الفورية، والعمل دون WAL — ينبغي استبدالها بأمر edition على نمط Rust.
يُعدّ SQLite المعيار الصناعي لتخزين البيانات محليًا، وهو — بخلاف خادم قواعد بيانات تقليدي — نظام إدارة قواعد بيانات في صورة مكتبة لا عملية منفصلة، ما يُبقي التطبيقات مستقلة بذاتها. لكن في تدوينة نُشرت في 15 يوليو، يرى المطوّر Mort أن الإعدادات الافتراضية خاطئة، وأن المحرّك يحتاج إلى سبيل للتقدّم دون كسر البرمجيات القائمة.
أربعة إعدادات افتراضية يريد الكاتب تغييرها
الأول هو قيود المفاتيح الخارجية التي يتجاهلها SQLite ما لم تُشغّل PRAGMA foreign_keys = ON. ويقول الكاتب إنه النظام الوحيد من نوعه الذي يعرفه ولا يفرض هذه القيود افتراضيًا، وإن نزوع SQLite إلى إعادة استخدام قيم ROWID يزيد الأمر سوءًا: فقد يشير مرجع معلّق بصمت إلى الصف الخطأ. في مثاله، يَرِث حساب جديد يحصل بالصدفة على المعرّف نفسه منشورًا تركه مستخدم محذوف.
الثاني هو الأنواع. العمود المُعرَّف كـ INTEGER يستخدم INTEGER affinity، فيُخزَّن النص الذي يشبه الرقم كرقم، أما ما عداه فيُخزَّن كما هو؛ لذلك يمكن أن يحتوي عمود المدة على النص “Way too long, I mean come on”. وتصلح جداول STRICT ذلك — إذ يؤدي إدخال TEXT في عمود INTEGER إلى خطأ — لكن لا يوجد أمر pragma يجعل كل الجداول صارمة، لذا يجب إضافة الكلمة يدويًا.
الثالث هو التزامن: يسمح SQLite بعدد كبير من القُرّاء لكن بكاتب واحد فقط، وافتراضيًا تحصل عملية ثانية تحاول أخذ قفل الكتابة على خطأ SQLITE_BUSY فورًا. ويفضّل الكاتب انتظار القفل حتى انتهاء مهلة محددة (PRAGMA busy_timeout = 5000)، وهو إعداد يقول إنه أضافه فقط بعد أعطال حقيقية في الإنتاج.
الأداء واقتراح الـ edition
الرابع هو الأداء. سجل الكتابة المسبقة معطّل افتراضيًا؛ وتفعيل PRAGMA journal_mode = WAL يسرّع الكتابة كثيرًا في معظم الحالات، ويسمح مع PRAGMA synchronous = NORMAL بتقليل عمليات مزامنة القرص بدرجة كبيرة دون خطر تلف البيانات. ويحيل الكاتب للتفاصيل إلى مقال سيلفان كركور عن تحسين SQLite للخوادم.
ولإصلاح كل ذلك دون كسر التوافق الخلفي — وهو التبرير المعتاد للإبقاء على الإعدادات الحالية — يقترح الكاتب أمر pragma خارقًا واحدًا: PRAGMA edition = 2026، يكون اختصارًا لـ foreign_keys = ON وbusy_timeout = 5000 وjournal_mode = WAL وsynchronous = NORMAL، مع جعل جداول STRICT الافتراضي.
الفكرة مستعارة من إصدارات Rust. ويرى الكاتب أن edition المبني على السنة أفضل من شيء مثل “use strict” في JavaScript، لأن الإعدادات الافتراضية المعقولة تتغير بمرور الوقت: فإذا وصل لاحقًا صيغة سجل مثل WAL2 إلى الفرع الرئيسي، فسيقوم PRAGMA edition = 2034 بتعيينها. ويشير أحد القراء في التعليقات إلى أن SQL 99 يعرّف أصلًا أسماء بديلة للأنواع عبر CREATE DOMAIN.
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.