SQLite3 – العمل المدمج مع SQLite في بايثون

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة عن SQLite ووحدة sqlite3

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

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

التثبيت والتوافق

وحدة sqlite3 مضمنة في المكتبة القياسية لبايثون منذ الإصدار 2.5 ومتاحة بدون تثبيت إضافي. وهي توفر توافقًا كاملاً مع أنظمة التشغيل Windows وmacOS وLinux، وتقدم واجهة للعمل مع SQLite الإصدار 3.

import sqlite3

الاتصال بقاعدة البيانات وإنشاء الاتصال

إنشاء قاعدة بيانات ملفية

conn = sqlite3.connect('my_database.db')

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

إنشاء قاعدة بيانات في الذاكرة

conn = sqlite3.connect(':memory:')

هذا الخيار مناسب بشكل خاص للاختبار والعمليات المؤقتة.

معاملات اتصال إضافية

conn = sqlite3.connect('database.db', 
                      check_same_thread=False,
                      detect_types=sqlite3.PARSE_DECLTYPES)

إنشاء الجداول والعمل مع مخطط البيانات

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

cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT UNIQUE,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
''')
conn.commit()

أنواع البيانات في SQLite

SQLite يدعم خمسة أنواع بيانات أساسية:

  • INTEGER - الأعداد الصحيحة
  • REAL - الأعداد العشرية
  • TEXT - النصوص
  • BLOB - البيانات الثنائية
  • NULL - عدم وجود قيمة

SQLite يستخدم الكتابة الديناميكية، مما يوفر مرونة ولكنه يتطلب الانتباه عند التعامل مع البيانات.

عمليات CRUD (إنشاء، قراءة، تحديث، حذف)

إدراج البيانات

# إدراج سجل واحد
cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", 
               ("أحمد محمد", 30, "ahmed@example.com"))

# إدراج عدة سجلات
users_data = [
    ("سارة علي", 25, "sara@example.com"),
    ("خالد عمر", 35, "khaled@example.com"),
    ("نورة حسن", 28, "nora@example.com")
]
cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users_data)
conn.commit()

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

# استعلام جميع السجلات
cursor.execute("SELECT * FROM users")
all_users = cursor.fetchall()

# استعلام بشرط
cursor.execute("SELECT name, age FROM users WHERE age > ?", (25,))
adult_users = cursor.fetchall()

# استعلام مع ترتيب
cursor.execute("SELECT * FROM users ORDER BY age DESC")
sorted_users = cursor.fetchall()

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

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

# الحصول على عدد الصفوف المعدلة
print(f"عدد الصفوف المحدثة: {cursor.rowcount}")

حذف البيانات

cursor.execute("DELETE FROM users WHERE name = ?", ("نورة حسن",))
conn.commit()
print(f"عدد الصفوف المحذوفة: {cursor.rowcount}")

المعاملات (Transactions) وإدارة التغييرات

SQLite يدعم المعاملات لضمان سلامة البيانات. يمكنك استخدام commit() لحفظ التغييرات و rollback() للتراجع عنها.

try:
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("محمود", 40))
    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("ليلى", 32))
    conn.commit()
    print("تم حفظ التغييرات بنجاح")
except Exception as e:
    conn.rollback()
    print(f"حدث خطأ: {e}")

استخدام SQLite مع Pandas

يمكنك قراءة بيانات SQLite مباشرة إلى DataFrame والعكس باستخدام Pandas:

import pandas as pd

# قراءة من قاعدة البيانات إلى DataFrame
df = pd.read_sql_query("SELECT * FROM users", conn)

# كتابة DataFrame إلى قاعدة البيانات
df.to_sql('users_backup', conn, if_exists='replace', index=False)

تحسين الأداء والنصائح

  • استخدم executemany() لإدراج كميات كبيرة من البيانات بدلاً من الحلقات التكرارية
  • قم بإنشاء فهارس (Indexes) على الأعمدة المستخدمة بكثرة في الاستعلامات
  • استخدم PRAGMA journal_mode=WAL لتحسين الأداء في التطبيقات متعددة الخيوط
  • أغلق الاتصال دائمًا باستخدام conn.close() بعد الانتهاء

النسخ الاحتياطي والاستعادة

# النسخ الاحتياطي
backup_conn = sqlite3.connect('backup.db')
conn.backup(backup_conn)
backup_conn.close()
print("تم إنشاء النسخة الاحتياطية بنجاح")

توصيات