اختبار قواعد البيانات
Databases Quiz
اختبار قواعد البيانات — Databases Quiz
وصلت للاختبار الختامي لفصل قواعد البيانات. هذا الاختبار يختبر فهمك لـ:
sqlite3والاستعلامات الآمنة- عمليات CRUD الأربع
- أنماط ORM ومبدأ Repository
- قراءة النتائج وتفسيرها
كل تحدٍّ مستقل — لا تحتاج نتيجة السابق لتحلّ التالي. إذا علقت راجع الدروس المرتبطة.
التحدي الأول — الاتصال والإنشاء
الاستعلامات الآمنة هي أهم مبدأ في التعامل مع قواعد البيانات. أكمل الكود لإنشاء جدول books وإدراج كتابين.
المرجع: درس أساسيات SQLite
التحدي الثاني — القراءة والفلترة
القراءة الصحيحة تعتمد على ORDER BY للحصول على نتائج محددة.
المرجع: درس عمليات CRUD
التحدي الثالث — التحديث والحذف
تحديث وحذف سجلات موجودة مع التحقق من rowcount.
المرجع: درس عمليات CRUD
التحدي الرابع — الاستعلامات المتقدمة
COUNT, MAX, MIN, ORDER BY — استعلامات تجميع وترتيب أساسية.
المرجع: درس أساسيات SQLite
التحدي الخامس — نمط Repository
الجمع بين CRUD وتنظيم الكود في طبقة مستقلة — هذا ما يميّز الكود الاحترافي.
المرجع: درس مقدمة SQLAlchemy
مراجعة المفاهيم
قبل الملخص، اختبر فهمك للقرارات التي تحمي بياناتك — وليس فقط الصيغ التي تنفذها. أجب قبل أن تنظر إلى الشرح.
? تفصل البيانات عن نص SQL: القيمة تصل للمحرك كقيمة، لا كجزء من الاستعلام، فلا يستطيع مدخل خبيث مثل ' OR '1'='1 تغيير منطق الاستعلام. دمج النصوص بـ f-string يجعل أي مدخل مستخدم جزءاً من الـ SQL نفسه — وهذا هو SQL Injection بعينه.conn.commit(). بدونها، إغلاق الاتصال يتجاهل كل ما أدرجته أو عدّلته — والكود يبدو ناجحاً لأن execute لم يرمِ خطأ. القراءة فقط لا تحتاج commit؛ كل كتابة تحتاجه.add وget_by_id. بقية التطبيق تتعامل مع الواجهة فقط، فتستطيع تبديل SQLite بـ PostgreSQL — أو بـ SQLAlchemy كما رأيت في التحدي الخامس — دون لمس أي كود خارج الطبقة. هذا هو الفصل الذي يجعل الكود قابلاً للاختبار أيضاً.استرجع الآن الأسماء نفسها من ذاكرتك — هذه هي المفردات التي ستكتبها في كل تعامل مع sqlite3.
fetchone() تُعيد صفاً واحداً أو None إذا لم يطابق شيء — الأنسب عند البحث بمعرّف فريد. أما fetchall() فتُعيد قائمة بكل النتائج. الفحص if row is None بعد fetchone هو عادة الكود الآمن.cursor.lastrowid يحمل المعرّف الذي ولّده AUTOINCREMENT لآخر صف أدرجته — وهو ما استخدمه BookRepository.add ليُعيد ID الكتاب الجديد. بدونه تحتاج استعلاماً إضافياً لمعرفة معرّف ما أدرجته للتو.ملخص الفصل — Chapter Summary
أتممت فصل قواعد البيانات. إليك ما تعلمته:
أساسيات SQLite:
sqlite3.connect(':memory:')للاختبار، ملف للإنتاجcursor.execute(sql, params)مع?دائماً — لا استثناءfetchall()للكل،fetchone()للواحدconn.commit()لحفظ التغييرات
عمليات CRUD:
- Create:
INSERT INTO ... VALUES (?, ?)+lastrowid - Read:
SELECT ... WHERE ... ORDER BY ... - Update:
UPDATE ... SET ... WHERE id = ?+rowcount - Delete:
DELETE FROM ... WHERE id = ?+rowcount
SQLAlchemy ORM:
- النموذج التعريفي:
class User(Base): __tablename__ = 'users' - الجلسة:
session.add(),session.commit(),session.query() - قابلية التبديل: تُغيّر
create_engine(...)فقط لتُغيّر قاعدة البيانات
المبدأ الأهم: الاستعلامات الموضعية تُبقي تطبيقك آمناً من SQL Injection — لا تكسر هذه القاعدة أبداً.