من الصفر إلى مشروع: تطبيق بايثون يتعامل مع قاعدة بيانات SQLite
نبني معًا تطبيقًا صغيرًا لإدارة مكتبة كتب: تصميم الجدول، والاتصال بقاعدة SQLite، والإضافة والبحث والتعديل والحذف، ثم تحويله إلى مشروع يليق بملف أعمالك.
- 7 دقائق قراءة
كل البرامج التي كتبناها في المقالات السابقة تنسى كل شيء عندما تُغلق. تدخل أسماء الطلاب ودرجاتهم، ثم تغلق البرنامج، فتضيع البيانات. البرامج الحقيقية تحتاج إلى حفظ دائم، والطريقة الأكثر تنظيمًا لذلك هي قاعدة البيانات. في هذا المقال نبني معًا مشروعًا كاملًا صغيرًا: تطبيق لإدارة مكتبة كتب شخصية، يحفظ الكتب في قاعدة بيانات SQLite، ويتيح الإضافة والبحث والتعديل والحذف. هذا النوع من العمليات يسمى اختصارًا CRUD، وهو أساس معظم التطبيقات التي تستخدمها يوميًا، من قوائم المهام إلى المتاجر الإلكترونية.
ماذا ستتعلم في هذا المقال؟
- ما قاعدة البيانات، ولماذا SQLite مناسبة للبداية.
- أساسيات لغة SQL: إنشاء جدول، والإضافة، والاستعلام، والتعديل، والحذف.
- كيف تتصل بقاعدة البيانات من بايثون بأمان باستخدام الاستعلامات المعاملية.
- كيف تحول المشروع إلى عمل يليق بملف أعمالك.
لماذا قاعدة بيانات؟ ولماذا SQLite؟
قد تسأل: لماذا لا أحفظ البيانات في ملف نصي؟ يمكنك ذلك للبيانات البسيطة، لكن مع ازدياد حجمها ستحتاج إلى البحث السريع، والتعديل دون إعادة كتابة الملف كله، ومنع تكرار البيانات أو تلفها. قواعد البيانات صُممت لكل هذا.
SQLite قاعدة بيانات خفيفة تُحفظ كلها في ملف واحد على جهازك، ولا تحتاج إلى خادم أو تثبيت منفصل، والأجمل أنها مدمجة في بايثون من خلال الوحدة sqlite3. وهي ليست لعبة تعليمية فقط؛ فهي مستخدمة في عدد هائل من التطبيقات والأجهزة حول العالم، من الهواتف إلى المتصفحات. وما تتعلمه فيها من لغة SQL ينتقل معك إلى قواعد بيانات أكبر مثل MySQL و PostgreSQL.
مفاهيم أساسية قبل أن نبدأ
قاعدة البيانات العلائقية تنظم المعلومات في جداول، مثل جداول البيانات التي تعرفها، لكن بقواعد أكثر صرامة. كل جدول يمثل نوعًا واحدًا من الأشياء: جدول للكتب، وجدول للقراء، وجدول للاستعارات. كل صف يمثل عنصرًا واحدًا، وكل عمود يمثل صفة واحدة له، ولكل عمود نوع ثابت: نص أو عدد صحيح أو عدد عشري. ميزة هذا التنظيم أن الجداول ترتبط ببعضها عبر المفاتيح؛ فجدول الاستعارات لا يكرر اسم الكتاب ومؤلفه في كل مرة، بل يحفظ رقم الكتاب فقط، ويشير إلى صفه في جدول الكتب. هكذا تُحفظ المعلومة في مكان واحد، وإذا صححت اسم مؤلف مرة واحدة، يظهر التصحيح في كل مكان. أما SQL فهي اللغة التي نخاطب بها قاعدة البيانات: نطلب منها أن تنشئ جدولًا، أو تضيف صفًا، أو تبحث، أو تعدل، أو تحذف. وهي لغة وصفية: تقول «ماذا» تريد، وتترك لقاعدة البيانات أن تقرر «كيف» تنفذه بأسرع طريقة.
خطة المشروع
الخطوة 1: تصميم الجدول
قبل أي كود، فكر في البيانات. كل كتاب له عنوان ومؤلف وسنة نشر وحالة القراءة. في قاعدة البيانات نحفظ ذلك في جدول، كل صف فيه كتاب، وكل عمود معلومة:
| العمود | النوع | الوصف |
|---|---|---|
| id | INTEGER PRIMARY KEY | رقم فريد لكل كتاب تنشئه قاعدة البيانات تلقائيًا |
| title | TEXT NOT NULL | عنوان الكتاب، وهو إلزامي |
| author | TEXT | اسم المؤلف |
| year | INTEGER | سنة النشر |
| status | TEXT | حالة القراءة: لم أقرأه، أقرؤه، قرأته |
المفتاح الأساسي (Primary Key) مفهوم مهم: رقم لا يتكرر، نستخدمه للإشارة إلى كتاب بعينه عند التعديل أو الحذف، حتى لو تشابهت العناوين.
الخطوة 2: الاتصال وإنشاء الجدول
import sqlite3
conn = sqlite3.connect("library.db")
conn.execute("""
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author TEXT,
year INTEGER,
status TEXT DEFAULT 'unread'
)
""")
conn.commit()
الدالة connect تفتح ملف قاعدة البيانات، وتنشئه إذا لم يكن موجودًا. والعبارة IF NOT EXISTS تجعل الكود آمنًا للتشغيل أكثر من مرة. أما commit فتثبت التغييرات في الملف، ومن دونها قد تضيع.
الخطوة 3: العمليات الأربع
الإضافة
def add_book(title, author, year):
conn.execute(
"INSERT INTO books (title, author, year) VALUES (?, ?, ?)",
(title, author, year),
)
conn.commit()
لاحظ علامات الاستفهام. هذه استعلامات معاملية (Parameterized Queries)، وهي أهم قاعدة أمان في هذا المقال: لا تدمج مدخلات المستخدم في نص الاستعلام مباشرة بطريقة مثل النصوص المنسقة. لو فعلت، يستطيع شخص أن يكتب في خانة العنوان نصًا يغير معنى الاستعلام ويحذف بياناتك، وهو هجوم معروف باسم «حقن SQL». علامات الاستفهام تجعل مكتبة sqlite3 تتعامل مع المدخلات كبيانات فقط، مهما كان محتواها.
البحث
def find_books(word):
rows = conn.execute(
"SELECT id, title, author, year, status FROM books "
"WHERE title LIKE ? OR author LIKE ? ORDER BY title",
(f"%{word}%", f"%{word}%"),
)
return rows.fetchall()
الكلمة LIKE مع علامة النسبة المئوية تبحث عن أي عنوان أو مؤلف يحتوي على الكلمة في أي موضع. وORDER BY ترتب النتائج.
التعديل والحذف
def set_status(book_id, status):
conn.execute("UPDATE books SET status = ? WHERE id = ?", (status, book_id))
conn.commit()
def delete_book(book_id):
conn.execute("DELETE FROM books WHERE id = ?", (book_id,))
conn.commit()
انتبه إلى جملة WHERE. عبارة DELETE من دونها تحذف كل الصفوف في الجدول! لهذا نحدد دائمًا الكتاب برقمه الفريد، ومن الحكمة أن يطلب البرنامج تأكيدًا من المستخدم قبل الحذف.
يقدم كوري شيفر في الفيديو التالي شرحًا شاملًا لاستخدام SQLite من بايثون، يكمل ما تعلمته هنا، باللغة الإنجليزية:
الخطوة 4: واجهة بسيطة
لنربط كل شيء بقائمة أوامر في سطر الأوامر: يعرض البرنامج خيارات مرقمة (إضافة، بحث، تعديل الحالة، حذف، خروج)، ويقرأ اختيار المستخدم في حلقة، ويستدعي الدالة المناسبة. هنا تظهر فائدة ما تعلمته في مقال الدوال: كل عملية دالة مستقلة، والحلقة الرئيسية قصيرة وواضحة. وإذا أردت تنظيمًا أكبر، يمكنك جمع كل هذه الدوال في صنف Library كما شرحنا في مقال البرمجة كائنية التوجه، بحيث يحتفظ الكائن بالاتصال بقاعدة البيانات.
الخطوة 5: حوّل التمرين إلى مشروع حقيقي
الفرق بين تمرين ومشروع يليق بملف أعمالك في التفاصيل:
- التحقق من المدخلات: ماذا لو أدخل المستخدم سنة مثل «ألفين»؟ تعامل مع الخطأ برسالة واضحة بدل أن يتوقف البرنامج.
- التقارير: أضف أمرًا يعرض عدد الكتب في كل حالة باستخدام
GROUP BYوCOUNT. - إغلاق الاتصال: استخدم
withأو أغلق الاتصال عند الخروج. - التصدير: أضف خيارًا لتصدير القائمة إلى ملف CSV يفتح في برامج الجداول.
- التوثيق: اكتب ملف README يشرح فكرة المشروع وطريقة تشغيله، وانشره على GitHub.
كيف ترى ما بداخل قاعدة البيانات؟
أثناء التطوير ستحتاج كثيرًا إلى أن تتأكد بعينك مما حُفظ فعلًا. هناك برامج مجانية مفتوحة المصدر تفتح ملف SQLite وتعرض جداوله في شكل يشبه برامج الجداول، مثل DB Browser for SQLite، وتسمح لك بكتابة استعلامات SQL وتجربتها قبل وضعها في الكود. عادة مفيدة: جرّب كل استعلام جديد هناك أولًا على نسخة من الملف، وعندما تتأكد من نتيجته انقله إلى برنامجك. وقبل أي تجربة حذف أو تعديل جماعي، احتفظ بنسخة احتياطية من ملف قاعدة البيانات في مجلد آخر.
أخطاء شائعة
- نسيان commit: تبدو الإضافة ناجحة، ثم تختفي البيانات بعد إغلاق البرنامج.
- بناء الاستعلام بدمج النصوص: ثغرة أمنية خطيرة كما شرحنا. استخدم علامات الاستفهام دائمًا.
- نسيان الفاصلة في الصف ذي العنصر الواحد:
(book_id,)وليس(book_id). - تعديل أو حذف دون WHERE: قد يغير كل الصفوف مرة واحدة.
أفكار لتوسيع المشروع
بعد أن يعمل التطبيق، جرّب أن تضيف جدولًا ثانيًا للتقييمات والملاحظات مرتبطًا بجدول الكتب، فتتعلم العلاقات بين الجداول. أو حوّل الواجهة إلى نافذة رسومية بمكتبة Tkinter المدمجة في بايثون. أو اجعل التطبيق موقعًا صغيرًا باستخدام Flask. كل توسعة تعلمك مهارة جديدة وتضيف إلى ملف أعمالك.
هذا المشروع خطوة متقدمة في رحلتك مع بايثون. وإذا كنت في بدايتها، فارجع إلى مقال لماذا تبدأ البرمجة ببايثون. وفي كورس بايثون في أكاديمية بدر التعليمية نبني مشروعات مثل هذا خطوة بخطوة مع مراجعة الكود. ولمصادر إضافية زر المكتبة التعليمية، وجرّب أداة اكتشف مسارك لتعرف ما يأتي بعد ذلك، أو تصفح كل الكورسات.
الخلاصة
قاعدة البيانات تمنح برنامجك ذاكرة دائمة، و SQLite أسهل طريق للبدء لأنها مدمجة في بايثون ولا تحتاج إلى خادم. صمم الجدول أولًا، واستخدم الاستعلامات المعاملية دائمًا، ولا تنس commit وجملة WHERE. ثم حوّل التمرين إلى مشروع موثق يعرض مهارتك.
© 2026 أكاديمية بدر التعليمية – هذا المحتوى حصري لأكاديمية بدر التعليمية. يُسمح بالاقتباس القصير مع ذكر المصدر ورابط الصفحة.
القسم: البرمجة
التعليقات (0)
يمكنك التعليق بدون حساب، ويظهر تعليقك بعد مراجعة الإدارة، وقد تُعدّل الصياغة قبل النشر.
لا توجد تعليقات بعد – كن أول من يشارك.


أضف تعليقًا