البرمجة

دليل استخدام SQLite3 بايثون

استخدام الوحدة SQLite3 في لغة بايثون: شرح شامل وموسع

تعتبر قواعد البيانات من الركائز الأساسية في تطوير البرمجيات الحديثة، حيث توفر وسيلة فعالة لتنظيم البيانات وتخزينها بطريقة يسهل الوصول إليها وإدارتها. من بين قواعد البيانات الخفيفة والمدمجة، تبرز قاعدة بيانات SQLite كخيار مثالي للكثير من التطبيقات، خاصة تلك التي تحتاج إلى تخزين بيانات محلية بدون الحاجة إلى خادم منفصل. في لغة البرمجة بايثون، توفر الوحدة المدمجة sqlite3 واجهة برمجية متكاملة للعمل مع قواعد بيانات SQLite، مما يجعلها أداة قوية وسهلة الاستخدام لإنشاء وإدارة قواعد البيانات الصغيرة والمتوسطة.

ما هي SQLite؟

SQLite هي قاعدة بيانات مفتوحة المصدر تعتمد على ملف واحد لتخزين جميع البيانات، مما يجعلها مدمجة وخفيفة الوزن مقارنة بقواعد البيانات التقليدية مثل MySQL أو PostgreSQL التي تعتمد على خوادم خارجية. تتيح SQLite إمكانية تنفيذ معظم العمليات القياسية لقواعد البيانات مثل إنشاء الجداول، إدخال البيانات، التحديث، الحذف، والاستعلامات المعقدة، لكنها لا تحتاج إلى تثبيت أو إدارة خادم منفصل، وهذا ما يجعلها مناسبة للتطبيقات الصغيرة والمتوسطة، التطبيقات المحمولة، والمشاريع التعليمية.

الوحدة sqlite3 في بايثون

تأتي مكتبة sqlite3 ضمن المكتبات القياسية في بايثون، مما يعني أنه يمكن استخدامها مباشرة دون الحاجة إلى تثبيت أي مكتبات خارجية. توفر الوحدة واجهة برمجية متوافقة مع معيار DB-API 2.0، مما يسهل الانتقال بين قواعد البيانات المختلفة باستخدام واجهات مشابهة.

فتح وإنشاء قاعدة بيانات

لبدء استخدام SQLite في بايثون، يجب أولاً إنشاء اتصال بقاعدة البيانات. يمكن أن تكون قاعدة البيانات موجودة مسبقًا أو يمكن إنشاؤها تلقائيًا عند محاولة الاتصال بملف غير موجود.

python
import sqlite3 # إنشاء اتصال بقاعدة بيانات (إن لم تكن موجودة يتم إنشاؤها) conn = sqlite3.connect('example.db') # إنشاء كائن المؤشر للتفاعل مع قاعدة البيانات cursor = conn.cursor()

في المثال أعلاه، عند استدعاء sqlite3.connect('example.db') يتم إنشاء ملف قاعدة بيانات جديد باسم example.db إذا لم يكن موجودًا، أو فتح القاعدة الموجودة.

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

تُستخدم جملة SQL CREATE TABLE لإنشاء جداول داخل قاعدة البيانات. بعد إنشاء كائن المؤشر cursor يمكن تنفيذ تعليمات SQL باستخدام الدالة execute().

python
cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE ) ''') conn.commit() # حفظ التغييرات

في هذا المثال، يتم إنشاء جدول باسم users يحتوي على أربعة أعمدة: معرف المستخدم id وهو مفتاح رئيسي يتم إنشاؤه تلقائيًا، واسم المستخدم، والعمر، والبريد الإلكتروني.

إدخال البيانات

يمكن إدخال البيانات إلى الجدول باستخدام جملة INSERT INTO. يمكن تنفيذها بعدة طرق:

  • إدخال سجل واحد

  • إدخال عدة سجلات دفعة واحدة

إدخال سجل واحد

python
cursor.execute(''' INSERT INTO users (name, age, email) VALUES (?, ?, ?) ''', ('أحمد', 30, '[email protected]')) conn.commit()

تم استخدام علامة الاستفهام كعلامة نائبة (placeholder) لتجنب ثغرات حقن SQL، حيث يتم تمرير البيانات كوسيطات منفصلة.

إدخال عدة سجلات دفعة واحدة

python
users_data = [ ('سارة', 25, '[email protected]'), ('محمد', 28, '[email protected]'), ('ليلى', 22, '[email protected]') ] cursor.executemany(''' INSERT INTO users (name, age, email) VALUES (?, ?, ?) ''', users_data) conn.commit()

باستخدام executemany يتم تنفيذ جملة الإدخال على مجموعة بيانات متعددة بكفاءة أكبر.

استعلام البيانات

يمكن استرجاع البيانات باستخدام جملة SQL SELECT. بعد تنفيذ الاستعلام، يمكن الحصول على النتائج بطرق متعددة:

استرجاع جميع النتائج

python
cursor.execute('SELECT * FROM users') rows = cursor.fetchall() for row in rows: print(row)

استرجاع سجل واحد فقط

python
cursor.execute('SELECT * FROM users WHERE name = ?', ('أحمد',)) row = cursor.fetchone() print(row)

تحديث البيانات

لتعديل البيانات داخل الجدول، تستخدم جملة UPDATE:

python
cursor.execute(''' UPDATE users SET age = ? WHERE name = ? ''', (31, 'أحمد')) conn.commit()

في هذا المثال، تم تحديث عمر المستخدم “أحمد” إلى 31.

حذف البيانات

لحذف سجلات من الجدول، تُستخدم جملة DELETE:

python
cursor.execute('DELETE FROM users WHERE name = ?', ('ليلى',)) conn.commit()

إدارة الاتصال وإغلاق قاعدة البيانات

بعد الانتهاء من العمل مع قاعدة البيانات، من الضروري إغلاق الاتصال لتحرير الموارد:

python
cursor.close() conn.close()

التعامل مع الأخطاء في SQLite

يمكن أن تحدث أخطاء أثناء التعامل مع قاعدة البيانات، مثل محاولة إدخال بيانات مخالفة لقيود الجدول أو مشاكل في الاتصال. من الأفضل استخدام بنية try-except لمعالجة هذه الأخطاء:

python
try: cursor.execute('INSERT INTO users (name, age, email) VALUES (?, ?, ?)', ('علي', 27, '[email protected]')) conn.commit() except sqlite3.IntegrityError as e: print("خطأ في الإدخال:", e) except sqlite3.Error as e: print("خطأ في قاعدة البيانات:", e)

خصائص ومزايا sqlite3 في بايثون

  • سهولة الاستخدام: توفر الوحدة واجهة بسيطة ومتوافقة مع SQL.

  • لا حاجة لخادم قاعدة بيانات: تعمل على ملفات قواعد بيانات مستقلة.

  • دعم المعاملات (Transactions): تسمح بتنفيذ عمليات متعددة بشكل آمن مع إمكانية التراجع.

  • السرعة والكفاءة: مناسب للتطبيقات التي لا تتطلب قواعد بيانات ضخمة.

  • التكامل مع بايثون: متوافقة مع معظم إصدارات بايثون بدون إضافات خارجية.

أمثلة متقدمة على استخدام sqlite3

التعامل مع البيانات المعقدة: استخدام جداول متعددة وعلاقات

لنفترض وجود جدول آخر للأوامر (orders) مرتبط بجدول المستخدمين (users):

python
cursor.execute(''' CREATE TABLE IF NOT EXISTS orders ( order_id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, product TEXT NOT NULL, quantity INTEGER, FOREIGN KEY(user_id) REFERENCES users(id) ) ''') conn.commit()

يمكن إدخال طلب جديد مرتبط بمستخدم:

python
cursor.execute(''' INSERT INTO orders (user_id, product, quantity) VALUES (?, ?, ?) ''', (1, 'حاسوب محمول', 2)) conn.commit()

تنفيذ استعلامات معقدة: الربط بين الجداول (JOIN)

لاسترجاع أسماء المستخدمين والمنتجات التي طلبوها:

python
cursor.execute(''' SELECT users.name, orders.product, orders.quantity FROM users JOIN orders ON users.id = orders.user_id ''') results = cursor.fetchall() for row in results: print(row)

استخدام المعاملات (Transactions)

يتيح SQLite3 تنفيذ عدة عمليات ضمن معاملة واحدة بحيث يمكن التراجع عنها كلها في حال وقوع خطأ:

python
try: conn.execute('BEGIN TRANSACTION') cursor.execute('UPDATE users SET age = ? WHERE id = ?', (35, 1)) cursor.execute('INSERT INTO orders (user_id, product, quantity) VALUES (?, ?, ?)', (1, 'هاتف ذكي', 1)) conn.commit() except sqlite3.Error: conn.rollback()

مقارنة SQLite مع قواعد بيانات أخرى في بايثون

الميزة SQLite3 MySQL / PostgreSQL
نوع قاعدة البيانات مدمجة (Embedded) خادم قاعدة بيانات مستقل
التثبيت مدمجة مع بايثون تتطلب تثبيت منفصل
الأداء ممتاز للتطبيقات الصغيرة والمتوسطة أفضل للأحجام الكبيرة والعمليات المعقدة
إدارة الاتصالات بسيطة، ملف واحد إدارة معقدة متعددة الاتصالات
دعم SQL المتقدم محدود نسبيًا دعم واسع للميزات المتقدمة
قابلية التوسع أقل قابلية للتوسع عالية وقابلة للتوسع

نصائح عملية عند استخدام sqlite3

  • استخدام placeholders: دائمًا استخدم علامات الاستفهام أو الأسماء المعلمة لتجنب ثغرات SQL Injection.

  • تحرير الموارد: اغلق الاتصالات والمؤشرات بعد الانتهاء لتجنب تسرب الموارد.

  • النسخ الاحتياطي الدوري: بما أن قاعدة البيانات عبارة عن ملف واحد، فمن الجيد عمل نسخ احتياطية دورية.

  • التحقق من وجود الجداول: استخدام IF NOT EXISTS عند إنشاء الجداول لتجنب الأخطاء في حال إعادة تشغيل السكربت.

استنتاج

تعتبر مكتبة sqlite3 في بايثون أداة قوية ومرنة للعمل مع قواعد بيانات SQLite المدمجة، مما يجعلها مناسبة للعديد من التطبيقات بدءًا من المشاريع التعليمية والتجارب الصغيرة وحتى التطبيقات العملية التي تحتاج إلى قاعدة بيانات خفيفة وسريعة. تمكّن هذه المكتبة المطور من إنشاء قواعد بيانات، إدارة الجداول، إدخال وتحديث وحذف البيانات، وتنفيذ استعلامات معقدة بكل سهولة وكفاءة. بالإضافة إلى كونها جزءًا من مكتبة بايثون القياسية، فإن sqlite3 توفر حلاً متكاملاً يمكن الاعتماد عليه في مختلف البيئات.

تُعَدُّ معرفة كيفية استخدام sqlite3 خطوة أساسية لكل مبرمج يعمل بلغة بايثون ويرغب في إدارة البيانات بشكل فعال، خاصة مع الزيادة المستمرة في الحاجة إلى حلول قواعد بيانات خفيفة ومستقلة.