قاعدة بيانات SQLite ما هي إلا ملف عادي
لو سبق واشتغلت على MySQL أو Postgres، فأنت معتاد على تنفيذ أمر مثل CREATE DATABASE myapp; ليتولى الخادم تسجيل قاعدة بيانات جديدة في مكانٍ ما بعيدًا عن نظرك. لكن SQLite يختلف تمامًا عن هذا الأسلوب؛ فلا يوجد خادم أصلًا، ولا حتى أمر CREATE DATABASE. قاعدة البيانات هنا مجرد ملف واحد عادي على القرص، وعادةً ما يحمل الامتداد .db أو .sqlite أو .sqlite3، مع أن هذه الامتدادات ليست سوى تعارف بين المطورين.
ولإنشاء قاعدة بيانات جديدة، يكفي أن تشير بأداة sqlite3 إلى اسم ملف لم يُنشأ بعد:
sqlite3 mydata.db
هذا كل شيء. إذا كان الملف mydata.db غير موجود، فإن SQLite جاهز لإنشائه. وإذا كان موجوداً مسبقاً، فسيقوم بفتحه. نفس الأمر يعمل في الحالتين. الصورة الذهنية الأقرب هنا هي "فتح مستند" لا "تشغيل خادم قاعدة بيانات".
ملف قاعدة البيانات لا يظهر إلا بعد الكتابة فيه
هذه نقطة تُربك كثيراً من المبتدئين. نفّذ الأمر السابق، اكتب .quit، ثم ألقِ نظرة على المجلد… لن تجد الملف!
السبب أن SQLite كسول بطبعه؛ فهو لا يُنشئ الملف على القرص ما لم يكن هناك شيء فعلي يُكتب فيه. وبمجرد أن تُنشئ جدولاً أو تُثبّت بيانات (commit)، يظهر الملف فوراً:
الآن أصبح ملف mydata.db موجوداً فعلاً على القرص. قبل عملية الكتابة الأولى، تكون "قاعدة البيانات" موجودة فقط في ذاكرة الاتصال. هذا الأمر قد يسبب بعض الالتباس أحياناً، لكنه مفيد في حالات أخرى، إذ يعني أن أي جلسة تُلغى قبل اكتمالها لن تترك أي أثر خلفها.
إنشاء قاعدة بيانات SQLite من سطر الأوامر
إليك سير العمل الكامل ابتداءً من صَدفة جديدة:
$ sqlite3 mydata.db
SQLite version 3.45.0
Enter ".help" for usage hints.
sqlite> CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
sqlite> .databases
main: /home/you/mydata.db r/w
sqlite> .quit
إليك بعض أوامر الـ CLI المفيدة وأنت بالداخل:
.databases— يعرض قواعد البيانات المرتبطة ومسارات ملفاتها..tables— يعرض الجداول الموجودة في قاعدة البيانات الحالية..schema— يظهر لك جملCREATE TABLEلكل شيء..quit— للخروج.
إذا كنت قد فتحت sqlite3 بدون تمرير أي ملف (يعني لا توجد قاعدة بيانات مفتوحة حالياً)، يمكنك ربط ملف باستخدام .open:
sqlite> .open mydata.db
نفس القاعدة: يُنشئ الملف إذا لم يكن موجودًا، ويفتحه إذا كان موجودًا.
ميزة "إن لم يكن موجودًا" مدمجة تلقائيًا
قلق شائع لمن قدِم من قواعد بيانات أخرى: ماذا لو كان الملف موجودًا أصلًا؟ هل سيتم استبداله؟ الجواب: لا. فتح ملف موجود يعني فتحه فقط، دون أي كتابة فوق محتواه. أقرب مكافئ لجملة CREATE DATABASE IF NOT EXISTS هو ببساطة... فتح الملف. فـ SQLite يتعامل مع الحالتين بنفس الأمر.
أما إذا كنت تريد البدء من الصفر فعلًا، فاحذف الملف أولًا:
rm mydata.db
sqlite3 mydata.db
لكن تأكّد جيدًا قبل ذلك، فلا يوجد تراجع ولا أداة إدارية لاستعادة الملف بعد حذفه.
إنشاء قاعدة بيانات SQLite من بايثون
في الغالب لن تعمل من سطر الأوامر، بل ستحتاج إلى إنشاء قواعد البيانات من داخل تطبيقك. الجميل أن بايثون تأتي بوحدة sqlite3 ضمن المكتبة القياسية، فلا حاجة لتثبيت أي شيء:
sqlite3.connect("mydata.db") يتبع نفس قاعدة سطر الأوامر تمامًا: ينشئ الملف إن لم يكن موجودًا، ويفتحه إن كان موجودًا. وكل روابط اللغات الأخرى (better-sqlite3 في Node، ومُشغّل database/sql في Go، وrusqlite في Rust، وغيرها) تعمل بنفس الطريقة — فجميعها تغلّف نفس مكتبة C في الأسفل.
اختصار خاص بـ Python: تمرير ":memory:" كمسار يمنحك قاعدة بيانات في الذاكرة memory تعيش بالكامل في الـ RAM وتختفي بمجرد إغلاق الاتصال. سنتناول هذا في الصفحة التالية.
أين يجب أن يوضع ملف قاعدة البيانات؟
بما أن قاعدة البيانات عبارة عن ملف، فسؤال "أين أضعه؟" سؤال مشروع. إليك بعض القواعد العامة:
- في تطبيق فعلي: ضعه داخل مجلد بيانات المستخدم أو في مجلد عمل التطبيق. لا تضعه بجانب الملف التنفيذي على الأنظمة التي لا تسمح بالكتابة في هذا المسار.
- في مشروع برمجي: في جذر المستودع أو ضمن مجلد
data/. وأضِفه إلى.gitignoreإذا كان يحتوي على حالة محلية — فرفع ملف قاعدة بيانات ثنائي إلى Git نادرًا ما ينتهي نهاية سعيدة. - في الاختبارات: استخدم
:memory:أو ملفًا مؤقتًا. سريع ويُنظّف نفسه تلقائيًا.
الصلاحيات مهمة أيضًا. المستخدم الذي يشغّل العملية يحتاج إلى صلاحيات قراءة وكتابة على الملف وعلى المجلد الأب معًا (لأن SQLite ينشئ ملفات قفل بجوار قاعدة البيانات أثناء عمليات الكتابة).
فحص سريع للتأكد من أن كل شيء يعمل
لنتأكد أن المنظومة كلها تعمل من البداية إلى النهاية:
من المفترض أن يرجع لك صفّان. لو نجح هذا، فمعناه أن ملف قاعدة البيانات موجود، والمخطط (schema) داخله، والبيانات قابلة للاستعلام. وهذه هي قصة "إنشاء قاعدة بيانات SQLite" كاملةً — بلا خادم، ولا مستخدمين، ولا جدول صلاحيات. مجرد ملف.
التالي: قواعد البيانات في الذاكرة (In-Memory)
نفس استدعاء sqlite3.connect(...) الذي ينشئ ملفًا على القرص، يستطيع — بتمرير الوسيط المناسب — أن ينشئ قاعدة بيانات لا تلامس القرص إطلاقًا. قواعد البيانات في الذاكرة (memory) هي الأسرع لتشغيل الاختبارات، أو تجريب مخطط جديد، أو الاحتفاظ ببيانات مؤقتة. وهذا ما سنتناوله في الفقرة التالية.
الأسئلة الشائعة
كيف أنشئ قاعدة بيانات في SQLite؟
نفّذ الأمر sqlite3 mydata.db من الطرفية. سيقوم SQLite بإنشاء الملف mydata.db إن لم يكن موجودًا، أو فتحه إن كان موجودًا. لا يوجد أمر منفصل اسمه CREATE DATABASE، فقاعدة البيانات هنا هي الملف نفسه.
هل يوجد أمر CREATE DATABASE في SQLite؟
لا. على عكس MySQL أو Postgres، لا يحتوي SQLite على أمر SQL باسم CREATE DATABASE. يتم إنشاء قاعدة البيانات في اللحظة التي تُشير فيها أداة sqlite3 (أو مكتبة عميل مثل وحدة sqlite3 في بايثون) إلى اسم ملف غير موجود بعد.
لماذا يظهر ملف قاعدة البيانات الجديد فارغًا أو لا يظهر أصلًا؟
SQLite كسول بطبعه، فهو لا يكتب الملف فعليًا على القرص حتى تُنشئ أول جدول أو تُنفّذ أول commit. لو شغّلت sqlite3 mydata.db ثم خرجت مباشرة، لن يُنشأ أي ملف. أنشئ جدولًا أو نفّذ .databases وسترى الملف يظهر.
كيف أُنشئ قاعدة بيانات SQLite من بايثون؟
استورد وحدة sqlite3 المدمجة، ثم استدعِ sqlite3.connect('mydata.db'). سيُنشأ الملف تلقائيًا إذا لم يكن موجودًا. ولو أردت قاعدة بيانات مؤقتة في الذاكرة فقط، مرّر ':memory:' بدلًا من اسم الملف.