أساسيات SQLite
SQLite Basics
أساسيات SQLite — SQLite Basics
قواعد البيانات هي العمود الفقري لأي تطبيق حقيقي. بدلاً من تخزين البيانات في قوائم تختفي حين تُغلق البرنامج، تُخزّنها في قاعدة بيانات تبقى محفوظة على القرص — أو في الذاكرة للاختبار السريع.
Python يُشحن مع وحدة sqlite3 في المكتبة القياسية. لا تحتاج pip install لأي شيء. SQLite هي محرك قاعدة بيانات خفيف يُخزّن كل شيء في ملف واحد — أو في :memory: للاختبار الآني.
ما هو SQLite؟
SQLite ليست خادماً منفصلاً كـPostgreSQL أو MySQL. إنها مكتبة تُدمج مباشرةً في تطبيقك. تُستخدم في:
- تطبيقات الموبايل (iOS, Android تعتمد عليها بشكل أصلي)
- تطبيقات سطح المكتب
- النماذج الأولية (Prototyping) قبل الانتقال لقاعدة بيانات كاملة
- الاختبارات الآلية (
:memory:تُنشأ وتُحذف في ثانية)
الاتصال وإنشاء الجدول
كل شيء يبدأ بـsqlite3.connect(). المعامل ':memory:' يُنشئ قاعدة بيانات مؤقتة في ذاكرة RAM — مثالية للتعلم والاختبار.
إدراج البيانات — INSERT
قاعدة لا استثناء فيها: لا تضع قيم المستخدم داخل النص مباشرةً. استخدم المعاملات الموضعية ? دائماً لتجنب هجوم SQL Injection.
لماذا المعاملات الموضعية؟ — SQL Injection
هذا المفهوم بالغ الأهمية. نظرة واحدة تكفي:
# خطر — DANGEROUS: user input directly in query string
name = "أحمد'; DROP TABLE users; --"
cursor.execute(f"SELECT * FROM users WHERE name = '{name}'")
# الاستعلام يصبح: SELECT * FROM users WHERE name = 'أحمد'; DROP TABLE users; --'
# النتيجة: حذف كامل قاعدة البيانات!
# آمن — SAFE: parameterized query
cursor.execute("SELECT * FROM users WHERE name = ?", (name,))
# sqlite3 يتعامل مع القيمة كنص حرفي لا أوامر SQL
وحدة sqlite3 تُحوّل المعاملات الموضعية تلقائياً إلى قيم آمنة. لا يُمكن للمهاجم حقن أوامر SQL عبر بيانات الإدخال.
قراءة البيانات — SELECT
fetchall() تُعيد جميع النتائج كقائمة من tuples. fetchone() تُعيد السجل الأول فقط.
إغلاق الاتصال
دائماً أغلق الاتصال بعد الانتهاء. الطريقة الأفضل: استخدام with كـContext Manager — يُغلق تلقائياً حتى لو حدث خطأ.
Row Factory — الوصول بالاسم
افتراضياً تُعيد sqlite3 نتائج كـtuples. بإسناد row_factory تصبح النتائج كائنات يمكن الوصول لحقولها بالاسم:
مراجعة سريعة — Quick Summary
| الدالة | الاستخدام |
|---|---|
sqlite3.connect(':memory:') | إنشاء اتصال (ذاكرة) |
conn.cursor() | إنشاء مؤشر للتنفيذ |
cursor.execute(sql, params) | تنفيذ استعلام واحد |
cursor.executemany(sql, list) | تنفيذ استعلام لعدة سجلات |
cursor.fetchall() | جلب جميع النتائج |
cursor.fetchone() | جلب أول نتيجة |
conn.commit() | حفظ التغييرات |
conn.close() | إغلاق الاتصال |