SQLite / الأساسي: المحرك المضمّن والبيانات الصحيحة / الدرس 1
المحرك المضمّن وعمر الاتصال
كوّن تصوراً خاصاً بـ SQLite لتنفيذ SQL وملكية الاتصال وقواعد الذاكرة الخاصة والملفات وأوامر الصدفة وهوية بيئة التشغيل.
في هذه الصفحة
أهداف الدرس
- تمييز SQLite المضمّن من خادم قاعدة بيانات.
- شرح اتصال الذاكرة والملف.
- تحديد الإصدار وحدود أوامر الأداة.
تتبّع SQL داخل عملية التطبيق
SQLite مكتبة مضمّنة تنفذ داخل عملية المستدعي، لا خادم قاعدة مستقل يحتاج إلى ضبط اتصال شبكي. يفتح الاتصال القاعدة ويحضّر العبارات ويقرأ نتائجها ويحرر الموارد. لا تحتاج الأمثلة إنشاء تسجيل دخول لخادم SQLite؛ إذ تحدد صلاحية الملف وهوية التطبيق وتكامله حدوداً مهمة للأمان والعمر.
لا يعني التضمين أن صحة البيانات والتزامن والاسترداد أمور تلقائية. قد تصل اتصالات متعددة إلى ملف واحد وتنسق المعاملات عملها. يختلف انهيار البرنامج عن رفض قيد SQL. حدد مالك الاتصال ومكان القاعدة ومتى تنتهي العبارة والمعاملة قبل التعامل مع المحرك كقاموس مريح يخفي هذه المسؤوليات.
استخدم مثال ذاكرة خاصة كاملاً
يبدأ كل اتصال :memory: عادي قاعدة مؤقتة مستقلة، ويؤدي إغلاقه إلى التخلص منها. يكتمل مثال SQL التالي عند تقديمه لاتصال جديد كما يفعل التحقق: ينشئ جدوله ويدرج صفوفاً مصطنعة ويعيد نتيجة مرتبة. لا يعتمد على مخطط تطبيق أو ملف قائم أو بيانات اعتماد أو خدمة.
يبقى العنصران طوال عمر ذلك الاتصال فقط. لا يعيد فتح اتصال :memory: آخر بياناتهما. تختلف قواعد ذاكرة URI المسماة المشتركة، وهي خارج هذا المثال الأول. لا تحول سلوك الذاكرة إلى ضمان دوام؛ فالبيانات الدائمة تحتاج ملفاً مختاراً عمداً وخطة تشغيل واسترداد تناسبها.
CREATE TABLE item(id INTEGER PRIMARY KEY, name TEXT NOT NULL);
INSERT INTO item(id,name) VALUES (1,'Notebook'),(2,'Pencil');
SELECT id,name FROM item ORDER BY id;
id|name
1|Notebook
2|Pencil
تضم القاعدة الجديدة عنصرين مصطنعين فقط؛ ويحدد ORDER BY العرض بدلاً من الاعتماد على الإدراج.
افصل SQL من ميزات صدفة الأوامر
صدفة sqlite3 أداة عميل تحيط بالمكتبة. تفسر هي أوامر النقطة مثل .tables و.schema و.mode، وليست عبارات SQL ينفذها المحرك. لذلك لا يصبح إرسال .tables عبر واجهة عادية استعلاماً وصفياً. تفصل الفاصلة المنقوطة العبارات، وقد يفرض المشغل المضيف واجهة لعبارة واحدة أو لنص كامل.
استعلم كتالوج SQL عندما تحتاج الشيفرة بيانات وصفية، وافصل تعليمات الصدفة عن أوامر التطبيق. قد يختلف إصدار الصدفة عن المكتبة المضمّنة في Python أو تطبيق هاتف أو إطار. افحص sqlite_version() في الاتصال الفعلي ولا تستنتج الميزة من برنامج آخر موجود على الجهاز.
افحص مخططاً معروفاً دون اختراع إصدار
يسأل النص الثاني sqlite_schema بعد إنشاء جدول محلي واحد، فيعيد اسمه ونوعه بدلاً من تقديم إصدار ثابت مختلق. يستطيع استعلام آخر عرض إصدار المحرك وخيارات ترجمته الفعلية. تعتمد الميزات على الإصدار وبناء المكتبة؛ لذلك افحص JSON أو إضافات الجداول الافتراضية الاختيارية في موضع التشغيل.
تتحقق الأمثلة بواسطة SQLite 3.45.1 في Python 3.12.3. يحدد ذلك بيئة الاختبار لا توصية بتصحيح إنتاجي أو ادعاء بالأحدث. ستوضح الدروس حدود STRICT و RETURNING و JSONB وغيرها، وتتناول لاحقاً عيب تزامن تاريخياً موثقاً في صفحة WAL الرسمية الحالية دون إخفائه وراء اسم الإصدار.
CREATE TABLE training_note(id INTEGER PRIMARY KEY, body TEXT);
SELECT name,type FROM sqlite_schema
WHERE name='training_note' ORDER BY name;
name|type
training_note|table
يضم الكتالوج الجدول المنشأ للتو؛ ويستبعد شرط الاسم المحدد الكائنات الأخرى.
أغلق الموارد وحدد عقد الدوام
للاتصال في اللغة المضيفة عمر مستقل عن كائن النتيجة. أنهِ المؤشرات أو أغلقها، وأنهِ المعاملة بقصد، وأغلق الاتصال الذي تملكه. يدير سياق اتصال Python إكمال المعاملة ولا يغلق الاتصال بذاته؛ تستطيع contextlib.closing أو finally امتلاك التنظيف. لا تعتمد جمع القمامة المستقبلي بديلاً عن ذلك.
استخدم للتدريب الملفي مجلداً مؤقتاً خاصاً جديداً، ولا تحذفه قبل إغلاق كل الاتصالات المملوكة. لا تفتح قاعدة المشروع المهيأة لفحص سلامة مثال. سجل نوع الاتصال والتهيئة والصفوف المتوقعة ونتيجة المعاملة والتنظيف، حتى تميز منطق SQL من حالة بيئة عرضية.
الأخطاء الشائعة وإصلاحها
no such table: item
- لماذا يحدث؟
- فتح اتصال جديد قاعدة ذاكرة خاصة مختلفة.
- كيف تصلحه؟
- أنشئ المخطط في الاتصال نفسه أو اختر القاعدة المقصودة عمداً.
- كيف تتجنب تكراره؟
- وثق المالك وهوية القاعدة.
near ".": syntax error
- لماذا يحدث؟
- أُرسل أمر نقطة للصدفة كأنه SQL.
- كيف تصلحه؟
- استخدم الصدفة لأوامرها أو استعلم sqlite_schema عبر الواجهة.
- كيف تتجنب تكراره؟
- افصل صياغة الأداة من SQL التطبيق.
بقيت القاعدة مقفلة بعد إغلاق الشاشة.
- لماذا يحدث؟
- امتد عمر اتصال أو مؤشر أو معاملة فوق العمل المطلوب.
- كيف تصلحه؟
- راجع الملكية وأنهِ الموارد وفق عقد الواجهة.
- كيف تتجنب تكراره؟
- اختبر تنظيف النجاح والفشل.
اختبر فهمك
1. لماذا لا يرى اتصالا :memory: عاديان بيانات بعضهما رغم تطابق الاسم الخاص؟
اعرض الحل المشروح
يبدأ كل منهما قاعدة مؤقتة مستقلة، فلا يعني الاسم أنهما يفتحان تخزيناً دائماً واحداً. أعد استخدام الاتصال المقصود لهذا التمرين، أو اختر إعداد مشاركة صريحاً تعرف قواعد عمره. لا تفترض أن فتح اتصال جديد يستعيد الجدول أو الصفوف التي كانت في الأول.
2. إذا اختلف إصدار الصدفة عن إصدار مكتبة Python، فأيهما يحكم الميزة المستخدمة من Python؟
اعرض الحل المشروح
يحكمها إصدار المكتبة وخيارات بنائها في اتصال Python الفعلي. استعلم sqlite_version() هناك وافحص توفر الميزة المطلوبة؛ فالصدفة برنامج مستقل قد يرتبط بمكتبة أخرى. لا يكفي نجاح تجربة في الصدفة لإثبات أن مكتبة التطبيق تدعمها.
أهم ما تعلمته
- ينفذ SQLite داخل التطبيق المضيف.
- تحدد هوية الاتصال وعمره رؤية الذاكرة الخاصة.
- تختلف أوامر الأداة و SQL المحرك وقدرات البيئة.