AzLearn

أساسيات SQLite

SQLite Basics

مفهوم ~18 دقيقة

أساسيات SQLite — SQLite Basics

قواعد البيانات هي العمود الفقري لأي تطبيق حقيقي. بدلاً من تخزين البيانات في قوائم تختفي حين تُغلق البرنامج، تُخزّنها في قاعدة بيانات تبقى محفوظة على القرص — أو في الذاكرة للاختبار السريع.

Python يُشحن مع وحدة sqlite3 في المكتبة القياسية. لا تحتاج pip install لأي شيء. SQLite هي محرك قاعدة بيانات خفيف يُخزّن كل شيء في ملف واحد — أو في :memory: للاختبار الآني.

ما هو SQLite؟

SQLite ليست خادماً منفصلاً كـPostgreSQL أو MySQL. إنها مكتبة تُدمج مباشرةً في تطبيقك. تُستخدم في:

  • تطبيقات الموبايل (iOS, Android تعتمد عليها بشكل أصلي)
  • تطبيقات سطح المكتب
  • النماذج الأولية (Prototyping) قبل الانتقال لقاعدة بيانات كاملة
  • الاختبارات الآلية (:memory: تُنشأ وتُحذف في ثانية)

الاتصال وإنشاء الجدول

كل شيء يبدأ بـsqlite3.connect(). المعامل ':memory:' يُنشئ قاعدة بيانات مؤقتة في ذاكرة RAM — مثالية للتعلم والاختبار.

main.go

إدراج البيانات — INSERT

قاعدة لا استثناء فيها: لا تضع قيم المستخدم داخل النص مباشرةً. استخدم المعاملات الموضعية ? دائماً لتجنب هجوم SQL Injection.

main.go

لماذا المعاملات الموضعية؟ — 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() تُعيد السجل الأول فقط.

main.go

إغلاق الاتصال

دائماً أغلق الاتصال بعد الانتهاء. الطريقة الأفضل: استخدام with كـContext Manager — يُغلق تلقائياً حتى لو حدث خطأ.

main.go

Row Factory — الوصول بالاسم

افتراضياً تُعيد sqlite3 نتائج كـtuples. بإسناد row_factory تصبح النتائج كائنات يمكن الوصول لحقولها بالاسم:

main.go

مراجعة سريعة — Quick Summary

الدالةالاستخدام
sqlite3.connect(':memory:')إنشاء اتصال (ذاكرة)
conn.cursor()إنشاء مؤشر للتنفيذ
cursor.execute(sql, params)تنفيذ استعلام واحد
cursor.executemany(sql, list)تنفيذ استعلام لعدة سجلات
cursor.fetchall()جلب جميع النتائج
cursor.fetchone()جلب أول نتيجة
conn.commit()حفظ التغييرات
conn.close()إغلاق الاتصال
تحدي — Challenge