عمليات CRUD
CRUD Operations
عمليات CRUD — CRUD Operations
CRUD هي اختصار للعمليات الأربع الأساسية في أي تطبيق يتعامل مع بيانات:
| الحرف | الاسم | SQL | المعنى |
|---|---|---|---|
| C | Create | INSERT | إنشاء سجل جديد |
| R | Read | SELECT | قراءة سجل أو أكثر |
| U | Update | UPDATE | تعديل سجل موجود |
| D | Delete | DELETE | حذف سجل |
في هذا الدرس نبني طبقة CRUD كاملة لجدول contacts (جهات الاتصال). كل خطوة هي تحدٍّ تطبّق فيه ما تعلمته.
بنية المشروع
سنبني وظيفة create_table أولاً، ثم وظائف CRUD بالترتيب. الهدف النهائي: نظام بسيط لإدارة جهات الاتصال.
contacts
├── id INTEGER PRIMARY KEY AUTOINCREMENT
├── name TEXT NOT NULL
├── phone TEXT
└── email TEXT
الخطوة 0 — إعداد الاتصال المشترك
في التطبيقات الحقيقية تُنشئ الاتصال مرة واحدة وتُمرّره للوظائف. هذا النمط يُوضّح المسؤوليات ويُسهّل الاختبار.
لاحظ CREATE TABLE IF NOT EXISTS — هذا التعبير يُنشئ الجدول فقط إن لم يكن موجوداً، مما يجعل الكود آمناً للتشغيل المتكرر.
الخطوة 1 — Create (الإدراج)
cursor.lastrowid يُعيد الـID الذي خصّصته SQLite للسجل المُدرج للتو. هذا مفيد لربط السجل بكيانات أخرى أو إعادته للمستخدم.
الخطوة 2 — Read (القراءة الجماعية والفردية)
القراءة لها وجهان: جلب جميع السجلات، وجلب سجل واحد بمعرّفه.
الخطوة 3 — Update (التحديث)
UPDATE يُعدّل سجلاً موجوداً. ضروري استخدام WHERE id = ? لتحديد السجل المستهدف — بدونه تُعدّل جميع السجلات في الجدول.
الخطوة 4 — Delete (الحذف)
الخطوة 5 — الطبقة الكاملة
الآن نجمع كل شيء في واجهة موحدة. هذا النمط يُشبه Repository Pattern الذي ستتعلمه في درس SQLAlchemy:
نقاط مهمة تذكّرها
1. conn.commit() بعد كل تعديل: بدون commit التغييرات مؤقتة في الذاكرة ولا تُحفظ على القرص (أو في :memory: تُفقد عند إغلاق الاتصال قبل الأوان).
2. ORDER BY في كل SELECT: النتائج بدون ORDER BY لها ترتيب غير محدد — صحيح في السيناريو الحالي لكن خطر في التطبيقات الحقيقية.
3. rowcount للتحقق: بعد UPDATE أو DELETE تحقق من cursor.rowcount. إذا كانت 0 فالسجل لم يُوجد، وهذا يساعدك تُعيد خطأ واضحاً للمستخدم.
4. المعاملات الموضعية أبداً: كل ? تحمي من SQL Injection. لا استثناء حتى لو كانت القيمة رقماً أو قيمة داخلية.