AzLearn

عمليات CRUD

CRUD Operations

تطبيق ~25 دقيقة

عمليات CRUD — CRUD Operations

CRUD هي اختصار للعمليات الأربع الأساسية في أي تطبيق يتعامل مع بيانات:

الحرفالاسمSQLالمعنى
CCreateINSERTإنشاء سجل جديد
RReadSELECTقراءة سجل أو أكثر
UUpdateUPDATEتعديل سجل موجود
DDeleteDELETEحذف سجل

في هذا الدرس نبني طبقة CRUD كاملة لجدول contacts (جهات الاتصال). كل خطوة هي تحدٍّ تطبّق فيه ما تعلمته.

بنية المشروع

سنبني وظيفة create_table أولاً، ثم وظائف CRUD بالترتيب. الهدف النهائي: نظام بسيط لإدارة جهات الاتصال.

contacts
├── id      INTEGER PRIMARY KEY AUTOINCREMENT
├── name    TEXT NOT NULL
├── phone   TEXT
└── email   TEXT

الخطوة 0 — إعداد الاتصال المشترك

في التطبيقات الحقيقية تُنشئ الاتصال مرة واحدة وتُمرّره للوظائف. هذا النمط يُوضّح المسؤوليات ويُسهّل الاختبار.

main.go

لاحظ CREATE TABLE IF NOT EXISTS — هذا التعبير يُنشئ الجدول فقط إن لم يكن موجوداً، مما يجعل الكود آمناً للتشغيل المتكرر.

الخطوة 1 — Create (الإدراج)

تحدي — Challenge

cursor.lastrowid يُعيد الـID الذي خصّصته SQLite للسجل المُدرج للتو. هذا مفيد لربط السجل بكيانات أخرى أو إعادته للمستخدم.

الخطوة 2 — Read (القراءة الجماعية والفردية)

القراءة لها وجهان: جلب جميع السجلات، وجلب سجل واحد بمعرّفه.

تحدي — Challenge

الخطوة 3 — Update (التحديث)

UPDATE يُعدّل سجلاً موجوداً. ضروري استخدام WHERE id = ? لتحديد السجل المستهدف — بدونه تُعدّل جميع السجلات في الجدول.

main.go

الخطوة 4 — Delete (الحذف)

تحدي — Challenge

الخطوة 5 — الطبقة الكاملة

الآن نجمع كل شيء في واجهة موحدة. هذا النمط يُشبه Repository Pattern الذي ستتعلمه في درس SQLAlchemy:

main.go

نقاط مهمة تذكّرها

1. conn.commit() بعد كل تعديل: بدون commit التغييرات مؤقتة في الذاكرة ولا تُحفظ على القرص (أو في :memory: تُفقد عند إغلاق الاتصال قبل الأوان).

2. ORDER BY في كل SELECT: النتائج بدون ORDER BY لها ترتيب غير محدد — صحيح في السيناريو الحالي لكن خطر في التطبيقات الحقيقية.

3. rowcount للتحقق: بعد UPDATE أو DELETE تحقق من cursor.rowcount. إذا كانت 0 فالسجل لم يُوجد، وهذا يساعدك تُعيد خطأ واضحاً للمستخدم.

4. المعاملات الموضعية أبداً: كل ? تحمي من SQL Injection. لا استثناء حتى لو كانت القيمة رقماً أو قيمة داخلية.

تحدي — Challenge