SQLite هو one of the most popular relational database management systems (RDBMS). إنه خالي من الوزن، ما يعني أنه لا يحتاج إلى مساحة كبيرة في نظامك. أحد أفضل ميزاته هو أنه serverless، لذا لا تحتاج إلى تثبيت أو إدارة مخزن منفصل لإستخدامه.

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

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

في هذا التوريتال، ستتعلم كيفية العمل مع SQLite بواسطة Python. هذا ما سنقوم بتغطيته في هذا التوريتال:

هذا التوريتال مثالي لأي شخص يريد بدء العمل مع البيانات دون الغوص في إعدادات معقدة.

كيفية إنشاء بيئة برمجيات بوتسوان

قبل العمل مع SQLite، دعونا نتأكد من أن بيئة برمجيات بوتسوان مستعدة. هذه هي الطريقة التي يتم تكوين كل شيء.

تثبيت Python

إذا لم يتم تثبيت Python على جهازك بعد، يمكنك تحميله من الموقع الرسمي للPython. اتبع التعليمات للنظام التشغيلي الخاص بك (Windows، macOS أو Linux).

لتفقد إذا كان Python مثبتًا، افتح محاربتك (أو مراقبة الأوامر) وأكتب:

python --version

هذا يبين الإصدار الحالي للPython المثبت. إذا لم يتم تثبيته، اتبع التعليمات على الموقع الرسمي للPython.

تثبيت وحدة SQLite3

الخبر الجيد هو أن SQLite3 متضمن Python! لا يتوجب عليك تثبيته بصفة منفصلة لأنه مدرج في المكتبة الاستاندارية للPython. هذا يعني أنه يمكنك بدء استخدامه مباشرة دون أي إعدادات إضافية.

من الأفضل إنشاء بيئة افتراضية لكل مشروع لتنظيم جهازك المعتمد عليه. البيئة الافتراضية تشبه قاحة نظيفة حيث يمكنك تثبيت المصادر دون تأثير على تثبيت الPython العالمي.

لإنشاء بيئة افتراضية، أتبع هذه الخطوات:

  1. أولاً، فتح محطة تحكمك أو رسالة تمريرك وتوجه إلى المجلد الذي تريد إنشاء مشروعك فيه.

  2. أرسال الأوامر التالية لإنشاء بيئة افتراضية:

python -m venv env

في هذه المرة ، env هو اسم البيئة الافتراضية. يمكنك تسميته أي شيء ترغب في.

  1. تفعيل البيئة الافتراضية:
# استخدم الأمر للويندوز
env\Scripts\activate

# استخدم الأمر ل macOS/Linux:
env/bin/activate

بعد تفعيل البيئة الافتراضية، ستلاحظ أن تعرف أن تشير المحطة تحكمك إلى اسم البيئة الافتراضية، ما يعني أنك تعمل بداخله الآن.

تثبيت المك

لنحتاج إلى بعض المكتبات الإضافية لهذا المشروع. بالتحديد، سنستخدم:

  • pandas:هذه المكتبة الاختيارية للتعامل وعرض البيانات بصيغة الجدول، وهي مفيدة للحالات المتقدمة.

  • faker:تساعد هذه المكتبة في إنتاج بيانات مزيفة، مثل الأسماء والعناوين العشوائية التي يمكن إدراجها في قاعدة البيانات للتجربة.

لتثبيت pandas و faker، فقط قم بتشغيل الأوامر التالية:

pip install pandas faker

هذا يثبت كلا pandas و faker في بيئة الافتراضية الخاصة بك. ومع ذلك، سيكون بيئتك معدة، وستكون جاهزة لبدء إنشاء وإدارة قاعدة البيانات SQLite في Python!

كيفية إنشاء قاعدة بيانات SQLite

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

كيفية عمل قواعد بيانات SQLite

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

كيفية إنشاء قاعدة بيانات SQLite جديدة

لننشئ قاعدة بيانات SQLite جديدة ولنتعلم كيفية التفاعل معها باستخدام مكتبة Python sqlite3.

الاتصال بقاعدة البيانات

لأن sqlite3 مثبت مسبقاً، فما عليك سوى استيراده في قوالب Python الخاصة بك. لإنشاء قاعدة بيانات جديدة أو الاتصال بقاعدة بيانات موجودة، نستخدم طريقة sqlite3.connect(). تأخذ هذه الطريقة اسم ملف قاعدة البيانات كمعطى. إذا لم يكن الملف موجوداً، سيخلق SQLiteه تلقائياً.

import sqlite3

# الاتصال بقاعدة البيانات SQLite (أو إنشائها إذا لم يكن موجودة)
connection = sqlite3.connect('my_database.db')

في هذا الحال، سينشئ ملفاً بأسم my_database.db في نفس مجلد السكربت. إذا كان الملف موجوداً بالفعل، فإن SQLite سيفتح الاتصال له فقط.

إنشاء المؤشر

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

# إنشاء شيء من المؤشر
cursor = connection.cursor()

إغلاق الاتصال

بعد أن تنتهي من العمل بالقاعدة البياناتية، يهم أن تغلق الاتصال لتحريك أي موارد. يمكنك غلق الاتصال بالأمر التالي:

# غلق الاتصال بالقاعدة البياناتية
connection.close()

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

حين تجري script بيثونك، سيتم إنشاء ملف يطلق عليه my_database.db في درايةك الحالية للعمل. لقد قمت بإنشاء قاعدة SQLite الأولى بنجاح!

كيفية استخدام مدير السياق لفتح وغلق الاتصالات

يوفر Python طريقة أكثر كفاءة ونظيفة للتعامل مع اتصالات القواعد البياناتية من خلال عبارة with، وهي معرفية أيضًا بـ “مدير السياق”. العبارة with تفتح وتغلق تلقائيًا الاتصال، متأكدًا من إغلاق الاتصال بطريقة correcta حتى وإن حدث خطأ أثناء عمليات القواعد البياناتية. هذا يبتدع حاجة لمطالبة تلقائيًا connection.close().

هذه هي طريقة تستخدم عبارة with للتعامل مع اتصالات القواعد البياناتية:

import sqlite3

# خطوة 1: استخدم 'with' للاتصال بالقاعدة (أو إنشاؤها) وإغلاقها تلقائيًا عند الانتهاء
with sqlite3.connect('my_database.db') as connection:

    # خطوة 2: أنشئ جهة تفاعل مع القاعدة
    cursor = connection.cursor()

    print("Database created and connected successfully!")

# لا تحتاج إلى مطالبة connection.close(); إنه يتم بمجرد التأكيد!

إذن من الآن، سنستخدم بيانة with في مثالات الكود القادمة لإدارة الاتصالات بقواعد البيانات بكفاءة. هذا سيجعل الكود أكثر توضيحا وأسهل للصيانة.

كيفية إنشاء جداول قاعدة البيانات

بما أننا قد أنشأنا قاعدة بيانات SQLite وتم الاتصال إليها، الخطوة التالية هي إنشاء جداول داخل القاعدة. الجدول هو الجزء الذي سيتم فيه تخزين البيانات، منظمة في صفوف (سجلات) وأعمدة (صفات). من أجل هذا العملية، سنقوم بإنشاء جدول يُدعى Students لتخزين المعلومات عن الطلاب، والذي سنستخدمه في الأقسام القادمة.

لإنشاء جدول، نستخدم البيانة SQL CREATE TABLE. هذه الأمرة تحدد هيكل الجدول، بما فيها أسماء الأعمدة وأنواع البيانات لكل عمود.

إليك أمر SQL بسيط لإنشاء جدول Students بالحقول التالية:

  • id: معرف فريد لكل تلميذ (عدد صحيح).

  • name: اسم الطالب (نص).

  • age: عمر الطالب (عدد صحيح).

  • email: عنوان البريد الإلكتروني للطالب (نص).

أمر SQL لإنشاء هذا الجدول سيبدو كالتالي:

CREATE TABLE Students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT
);

نستطيع تنفيذ هذا الأمر الSQL CREATE TABLE في بايثون بواسطة المكتبة الخاصة sqlite3. دعونا نرى كيف يمكننا فعل ذلك.

import sqlite3

# إستخدم 'with' للاتصال بقاعدة البيانات SQLite وإغلاق الاتصال تلقائيًا عند الانتهاء
with sqlite3.connect('my_database.db') as connection:

    # إنشاء مستعمل للبحث
    cursor = connection.cursor()

    # كتابة الأمر الSQL لإنشاء جدول الطلاب
    create_table_query = '''
    CREATE TABLE IF NOT EXISTS Students (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        age INTEGER,
        email TEXT
    );
    '''

    # تنفيذ الأمر الSQL
    cursor.execute(create_table_query)

    # تأكيد التغييرات
    connection.commit()

    # نقل رسالة تأكيدية
    print("Table 'Students' created successfully!")
  • IF NOT EXISTS: هذا يضمن إنشاء الجدول فقط إذا لم يكن موجودًا بالفعل، مما يمنع أثناء إنشاء الجدول من الأخطأ إذا تم إنشاءه من قبل.

  • connection.commit(): هذا يحفظ (يؤكد) التغييرات في القاعدة.

حين تشغل البايثون فورًا، سيتم إنشاء جدول Students في ملف القاعدة my_database.db. سترى أيضًا رسالة تأكيدية في المحرر التي تؤكد علمًا بأن الجدول تم إنشاؤها بنجاح.

إذا كنت تستخدم Visual Studio Code، يمكنك تثبيت الإضافة SQLite Viewer لعرض قواعد بيانات SQLite.

أنواع البيانات في SQLite وتعيينها إلى Python

يدعم SQLite العديد من أنواع البيانات التي يتوجب علينا فهمها عند تحديد الجداول الخاصة بنا. إليك ملخص سريع لأنواع البيانات الشائعة في SQLite وكيفية تعيينها إلى أنواع Python:

نوع البيانات في SQLite وصف المكافئ في Python
INTEGER الأعداد الكاملة int
TEXT نصوص الكلمات str
REAL أرقام النقطة العائمة float
BLOB بيانات بينية (مثل الصور، الملفات) bytes
NULL يمثل القيمة الخالية أو البيانات المفقودة None

في الجدول الخاص بنا Students:

  • id هو من نوع INTEGER، والذي يُعيّن إلى int في Python.

  • name و email هما من نوع TEXT، والتي تُعيّن إلى str في Python.

  • العمر أيضًا من النوع 整数، الذي يمكن ترجمته إلى int في Python.

كيفية إدخال البيانات في جدول

ومع إنشاء جدولنا الطلاب، فإن الوقت المناسب لبدء إدخال البيانات في القاعدة البيانات. في هذا القسم سنقوم بتغيير سجل واحد أو مجموعة من السجلات باستخدام Python و SQLite وكيفية تجنب مشاكل أولية متعددة مثل SQL injection باستخدام استعمال أسئلة محددة بالمساعيد.

كيفية إدخال سجل واحد

لإدخال البيانات في القاعدة البيانات، نستخدم أمر SQL INSERT INTO. دعونا نبدأ بإدخال سجل واحد في جدولنا الطلاب.

هذا هو النموذج البسيط لإدخال سجل واحد في جدول طلاب:

INSERT INTO Students (name, age, email) 
VALUES ('John Doe', 20, '[email protected]');

ومع ذلك، بدلاً من كتابة SQL مباشرة في خطوطنا البرمجية مع قيم مستبدلة بالقيم المستقرة، سنستخدم استعمال الأسئلة المحددة لجعل برمجياتنا أكثر أمانة ومرنة. تساعد استعمال الأسئلة المحددة على منع SQL injection هذه الهجمة الشائعة التي يمكن للمستخدمين الخبيثين تلاعب أسئلة SQL بتقديم معلومات سيئة.

هذا كيف يمكننا إدخال سجل واحد في جدول طلاب باستعمال الأسئلة المحد

import sqlite3

# استخدم 'with' لفتح وإغلاق الاتصال تلقائيًا
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # إدراج سجل في جدول الطلاب
    insert_query = '''
    INSERT INTO Students (name, age, email) 
    VALUES (?, ?, ?);
    '''
    student_data = ('Jane Doe', 23, '[email protected]')

    cursor.execute(insert_query, student_data)

    # تأكيد التغييرات تلقائيًا
    connection.commit()

    # لا تحتاج إلى مناسبة connection.close(); إنه يتم بمجرد الإجراء!
    print("Record inserted successfully!")

تمثاليات ال? تمثل القيم التي ستتم إدراجها في الجدول. تم تحميل القيم الحقيقية كمجموعة (student_data) في طريقة cursor.execute().

كيفية إدراج سجلات متعددة

إذا كنت ترغب في إدراج مجموعة من السجلات في وقت واحد، يمكنك استخدام طريقة executemany() في Python. يتمتع هذا الطريقة بقائمة من الأزواج، حيث كل زوج يمثل سجل واحد.

لجعل مثالنا أكثر قابلية للتحرك، يمكننا استخدام مكتبة Faker لتوليد بيانات الطلاب العشوائية. هذا مفيد للتجربة ومحاكاة حالات عالمية حقيقية.

from faker import Faker
import sqlite3

# تعيين Faker
fake = Faker(['en_IN'])

# استخدم 'with' لفتح وإغلاق الاتصال تلقائيًا
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # إدراج سجل في جدول الطلاب
    insert_query = '''
    INSERT INTO Students (name, age, email) 
    VALUES (?, ?, ?);
    '''
    students_data = [(fake.name(), fake.random_int(
        min=18, max=25), fake.email()) for _ in range(5)]

    # تنفيذ التعبير للسجلات المتعددة
    cursor.executemany(insert_query, students_data)

    # تأكيد التغييرات
    connection.commit()

    # طرح رسالة التأكيد
    print("Fake student records inserted successfully!")

في هذا الكود:

  • يgenerates Faker() أسماء عشوائية وأعمار وبريد إلكتروني للطلاب. من الخيارية إعطاء اللغة الموجهة ([‘en_IN’]).

  • cursor.executemany(): هذة الطريقة تسمح لنا بإدخال مجموعة من السجلات معاً في وقت واحد، مما يجعل البرمجيات أكثر فعالية.

  • students_data: قائمة من المجموعات حيث كل مجموعة تمثل بيانات طالب واحد.

كيفية التعامل مع المشاكل الشائعة: SQL Injection

تعتبر SQL injection خطأ أمني حيث يمكن للمهاجمين إدماج أو تغيير الأسئلة SQL بما فيها أدخال البرمجيات بواسطة المهاجمين مثل '; DROP TABLE Students; -- لحذف الجدول.

من خلال استخدام الأسئلة المعينة (كما تم إظهارها في الأعلى), نتخلص من هذه المشكلة. المراجعات ? في الأسئلة المعينة تتأكد من تمتع القيم بالطريقة التي تمثل بيانات وليس جزءًا من الأوامر الSQL. هذا يجعل من المستحيل تنفيذ البرمجيات الخبيثة.

كيفية معالجة البيانات

حسنًا، وبعد أن نضع بعض البيانات في جدولنا الالطلاب، دعونا نتعلم كيفية إسترجاع البيانات من الجدول. سنقوم بإكتشاف طرق مختلفة لجذب البيانات في البيت الأولي بالتعامل، بما في ذلك fetchone()، fetchall()، وfetchmany()الإجراءات.

للبحث عن بيانات من جدول، نستخدم عبارة SELECT التالية:

SELECT * FROM Students;

هذا الأمر يجذب جميع السجلات والأعمدة من جدول الطلاب. يمكننا تنفيذ هذه العبارة SELECT في البيت الأولي وجذب النتائج.

كيفية جذب جميع السجلات

هذه هي الطريقة التي يمكننا بها جذب جميع السجلات من جدول الطلاب:

import sqlite3

# استخدم 'with' للتواصل مع قاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:

    # أنشأ متغير قائم
    cursor = connection.cursor()

    # كتب أمر SQL لتحديد جميع السجلات من جدول Students
    select_query = "SELECT * FROM Students;"

    # تنفيذ الأمر الSQL
    cursor.execute(select_query)

    # جذب جميع السجلات
    all_students = cursor.fetchall()

    # عرض النتائج في المحرر
    print("All Students:")
    for student in all_students:
        print(student)

في هذا المثال، يجذب وظيفة fetchall() جميع الأسجل التي يعود بها الأساليب التي تكون قاعدة من التوائم.

All Students:
(1, 'Jane Doe', 23, '[email protected]')
(2, 'Bahadurjit Sabharwal', 18, '[email protected]')
(3, 'Zayyan Arya', 20, '[email protected]')
(4, 'Hemani Shukla', 18, '[email protected]')
(5, 'Warda Kara', 20, '[email protected]')
(6, 'Mitali Nazareth', 19, '[email protected]')

كيفية جذب سجل واحد فقط

إذا كنت تريد جذب سجل واحد فقط، يمكنك استخدام وظيفة fetchone():

import sqlite3

# استخدم 'with' للتواصل مع قاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:

    # توليد مجال نقاط
    cursor = connection.cursor()

    # كتابة أوامر الSQL لتحديد جميع السجلات من جدول الطلاب
    select_query = "SELECT * FROM Students;"

    # تنفيذ أوامر الSQL
    cursor.execute(select_query)

    # احضار سجل واحد
    student = cursor.fetchone()

    # عرض النتيجة
    print("First Student:")
    print(student)

المنتج:

First Student:
(1, 'Jane Doe', 23, '[email protected]')

كيفية احضار مجموعة من السجلات

للحصول على عدد معين من السجلات، يمكنك استخدام fetchmany(size):

import sqlite3

# استخدم 'with' للتواصل مع قاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:

    # توليد مجال نقاط
    cursor = connection.cursor()

    # كتابة أوامر الSQL لتحديد جميع السجلات من جدول الطلاب
    select_query = "SELECT * FROM Students;"

    # تنفيذ أوامر الSQL
    cursor.execute(select_query)

    # احضار ثلاثة سجلات
    three_students = cursor.fetchmany(3)

    # عرض النتيجة
    print("Three Students:")
    for student in three_students:
        print(student)

المنتج:

Three Students:
(1, 'Jane Doe', 23, '[email protected]')
(2, 'Bahadurjit Sabharwal', 18, '[email protected]')
(3, 'Zayyan Arya', 20, '[email protected]')

كيفية استخدام pandas للعرض الأفضل على البيانات

للعرض الأفضل على البيانات، يمكننا استخدام مكتبة pandas لخلق لوحة بيانات من ناتج أوامرنا. هذا يجعل التدريب والتعرف على البيانات أسهل.

هذه هي الطريقة التي يمكنك بها احضار جميع السجلات وعرضها كلوحة بيانات من مكتبة pandas:.

import sqlite3
import pandas as pd

# استخدم 'with' لاتصال بقاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:
    # أكتب الأوامر SQL لتحديد السجلات كلها من جدول الطلاب
    select_query = "SELECT * FROM Students;"

    # استخدم pandas لقراءة التحقيق الSQL مباشرة إلى مربع البيانات
    df = pd.read_sql_query(select_query, connection)

# عرض المربع البياناتي
print("All Students as DataFrame:")
print(df)

النسخة الخارجية:

All Students as DataFrame:
   id                  name  age                        email
0   1              Jane Doe   23             [email protected]
1   2  Bahadurjit Sabharwal   18  [email protected]
2   3           Zayyan Arya   20  [email protected]
3   4         Hemani Shukla   18    [email protected]
4   5            Warda Kara   20           [email protected]
5   6       Mitali Nazareth   19          [email protected]

تشغل ما يسمى pd.read_sql_query() يتم تنفيذ التحقيق الSQL ويعيد النتائج مباشرة كمربع البيانات المتكدس.

كيفية تحديث وحذف البيانات

في هذا القسم سنتعلم كيفية تحديث السجلات الموجودة وحذف السجلات من جدولنا Students باستخدام أوامر SQL في البرنامج Python. هذا أساسي لإدارة وحفظ البيانات بشكل فعال.

تحديث السجلات الموجودة

لتغيير السجلات الموجودة في القاعدة البياناتية، نستخدم أوامر القواعد الSQL UPDATE. يسمح هذه الأوامر لنا بتغيير قيم العناصر المحددة في سجل واحد أو أكثر من السجلات وفقاً لشرط معين.

على سبيل المثال، إذا أردنا تحديث عمر طالب ما، سيبدو أوامر القواعد الSQL كما يلي:

UPDATE Students 
SET age = 21 
WHERE name = 'Jane Doe';

حالياً، دعونا نكتب برمجيات الكود التي تحدد عمر طالب معين في جدولنا Students.

import sqlite3

# استخدم 'with' لاتصال بقاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # أمر SQL لتحديث عمر طالب
    update_query = '''
    UPDATE Students 
    SET age = ? 
    WHERE name = ?;
    '''

    # بيانات التحديث
    new_age = 21
    student_name = 'Jane Doe'

    # تنفيذ أمر SQL مع البيانات
    cursor.execute(update_query, (new_age, student_name))

    # تأكيد التغييرات لحفظ التحديث
    connection.commit()

    # طباعة رسالة التأكيد
    print(f"Updated age for {student_name} to {new_age}.")

في هذا المثال، استخدمنا استعمال الأسئلة المتعددة المعدلة لمنع اصابة باء الSQL.

كيفية حذف السجلات من الجدول

لإزالة السجلات من القاعدة البياناتية، نستخدم أمر SQL DELETE. يسمح لهذا الأمر بإزالة سطر واحد أو أكثر من السجلات وفقاً لشرط معين.

على سبيل المثال، إذا كنا نريد إزالة طالب يدعى ‘Jane Doe’, سيبدو الأمر SQL كما يلي:

DELETE FROM Students 
WHERE name = 'Jane Doe';

دعونا نكتب برنامج بيانات بليتون لإزالة طالب معين من جدولنا Students باستخدام الأمر with.

import sqlite3

# استخدم 'with' لاتصال بقاعدة البيانات SQLite
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # أمر SQL لإزالة طالب
    delete_query = '''
    DELETE FROM Students 
    WHERE name = ?;
    '''

    # إسم الطالب الذي يجب إزالته
    student_name = 'Jane Doe'

    # تنفيذ أمر SQL مع البيانات
    cursor.execute(delete_query, (student_name,))

    # تأكيد التغييرات لحفظ الإزالة
    connection.commit()

    # طباعة رسالة التأكيد
    print(f"Deleted student record for {student_name}.")

توجيهات مهمة

  • الشروط: دائمًا استخدم جملة WHERE عند تحديث أو حذف السجلات لتجنب تعديل أو إزالة جميع الصفوف في الجدول. بدون جملة WHERE، تؤثر الأمر على كل صف في الجدول.

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

كيفية استخدام العمليات

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

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

لماذا استخدام العمليات؟

  1. الذرية: تضمن العمليات أن تعتبر سلسلة عمليات واحدة. إذا فشلت إحدى العمليات، فلن يتم تطبيق أي من العمليات على قاعدة البيانات.

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

  3. العزلة: تعمل كل عملية بشكل مستقل عن الأخرى، مما يمنع التداخل غير المقصود.

  4. التحمل: بمجرد تأكيد عملية، تصبح التغييرات دائمة، حتى في حالة فشل النظام.

متى يجب استخدام العمليات؟

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

  • تنفيذ عمليات مرتبطة تتطلب النجاح أو الفشل معًا.

  • تعديل البيانات الحرجة التي تتطلب الاتساق والنزاهة.

  • العمل مع العمليات التي قد تفشل، مثل المعاملات المالية أو نقل البيانات.

كيفية إدارة المعاملات في بايثون

في SQLite، تتم إدارة المعاملات باستخدام أوامر BEGIN و COMMIT و ROLLBACK. ومع ذلك، عند استخدام وحدة sqlite3 في بايثون، فإنك عادةً ما تدير المعاملات من خلال كائن الاتصال.

بدء معاملة

تبدأ المعاملة ضمنياً عندما تقوم بتنفيذ أي بيان SQL. لبدء معاملة بشكل صريح، يمكنك استخدام أمر BEGIN:

cursor.execute("BEGIN;")

ومع ذلك، فإنه عادةً ما يكون غير ضروري لبدء معاملة يدوياً، حيث أن SQLite تبدأ معاملة تلقائياً عند تنفيذ بيان SQL.

كيفية تنفيذ معاملة

لحفظ جميع التغييرات التي تم إجراؤها أثناء المعاملة، تستخدم طريقة commit(). هذا يجعل جميع التعديلات دائمة في قاعدة البيانات.

connection.commit()

لقد استخدمنا بالفعل طريقة commit() في الأمثلة المقدمة أعلاه.

التراجع عن معاملة

إذا حدث خطأ ما وأردت التراجع عن التغييرات التي تمت أثناء المعاملة، يمكنك استخدام طريقة rollback(). هذا سيلغي جميع التغييرات التي تمت منذ بدء المعاملة.

connection.rollback()

مثال على استخدام المعاملات في بايثون

لتوضيح كيفية استخدام المعاملات في سيناريو واقعي، سنقوم بإنشاء جدول جديد يسمى Customers لإدارة حسابات العملاء. في هذا المثال، سنفترض أن لكل عميل balance. سنضيف عميلين إلى هذا الجدول ونقوم بعملية تحويل أموال بينهما.

أولاً، دعونا ننشئ جدول Customers ونضيف عميلين:

import sqlite3

# إنشاء جدول Customers وإضافة عميلين
with sqlite3.connect('my_database.db') as connection:
    cursor = connection.cursor()

    # إنشاء جدول Customers
    create_customers_table = '''
    CREATE TABLE IF NOT EXISTS Customers (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL UNIQUE,
        balance REAL NOT NULL
    );
    '''
    cursor.execute(create_customers_table)

    # إدخال عميلين
    cursor.execute(
        "INSERT INTO Customers (name, balance) VALUES (?, ?);", ('Ashutosh', 100.0))
    cursor.execute(
        "INSERT INTO Customers (name, balance) VALUES (?, ?);", ('Krishna', 50.0))

    connection.commit()

الآن، دعونا نقوم بعملية تحويل الأموال بين أشوتوش وكريشنا:

import sqlite3


def transfer_funds(from_customer, to_customer, amount):
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        try:
            # بدء معاملة
            cursor.execute("BEGIN;")

            # خصم المبلغ من المرسل
            cursor.execute(
                "UPDATE Customers SET balance = balance - ? WHERE name = ?;", (amount, from_customer))
            # إضافة المبلغ إلى المستلم
            cursor.execute(
                "UPDATE Customers SET balance = balance + ? WHERE name = ?;", (amount, to_customer))

            # تنفيذ التغييرات
            connection.commit()
            print(
                f"Transferred {amount} from {from_customer} to {to_customer}.")

        except Exception as e:
            # في حالة حدوث خطأ، التراجع عن المعاملة
            connection.rollback()
            print(f"Transaction failed: {e}")


# مثال على الاستخدام
transfer_funds('Ashutosh', 'Krishna', 80.0)

في هذا المثال، قمنا أولاً بإنشاء جدول Customers ووضعنا بينهما عددًا من الزبائن، أشوتوش بحوالة 100 رुپयs وكريشنا بحوالة 50 روبيين. بعدها قمنا بتحويل 80 ربية من أشوتوش إلى كريشنا. باستخدام المعاملات، نضمن أن كل من خسارة حساب أشوتوش والاحتواء في حساب كريشنا يتم تنفيذهما كعملية أوتومية واحدة، مما يحمي النسيج البياني من أي أخطأ. إذا فشل التحويل (على سبيل المثال، بسبب ندرة ربيات كافية)، ستتراجع المعاملة، مما يترك كلا الحسابات غير متغيرة.

كيفية تحسين أداء التحكمات SQLite مع التوجيه

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

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

كيفية تعبئة البase بالبيانات الزائفة

لكي نفعلي الاختبار على تأثير التوجيه، نحتاج إلى قاعدة بيانات كبيرة. بدلاً من إضافة السجلات يدويًا، يمكننا استخدام مكتبة faker</

سنستخدم طريقة executemany() لإدراج السجلات كما هو موضح أدناه:

import sqlite3
from faker import Faker

# قم بتهيئة مكتبة Faker
fake = Faker(['en_IN'])


def insert_fake_students(num_records):
    """Generate and insert fake student data into the Students table."""
    fake_data = [(fake.name(), fake.random_int(min=18, max=25),
                  fake.email()) for _ in range(num_records)]

    # استخدم 'with' للتعامل مع اتصال قاعدة البيانات
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # أدخل بيانات مزيفة إلى جدول الطلاب
        cursor.executemany('''
        INSERT INTO Students (name, age, email) 
        VALUES (?, ?, ?);
        ''', fake_data)

        connection.commit()

    print(f"{num_records} fake student records inserted successfully.")


# أدخل 10,000 سجل مزيف إلى جدول الطلاب
insert_fake_students(10000)

عند تشغيل هذا النص، سيتم إضافة 10,000 سجل طالب مزيف إلى جدول Students. في القسم التالي، سنستعلم قاعدة البيانات ونقارن أداء الاستعلامات مع وبدون فهارس.

كيفية الاستعلام بدون فهارس

في هذا القسم، سنستعلم جدول Students بدون أي فهارس لمراقبة أداء SQLite عند عدم وجود أي تحسينات. سيكون هذا كنقطة مرجعية لمقارنة الأداء عند إضافة الفهارس لاحقًا.

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

أولاً، سنستعلم جدول Students عن طريق البحث عن طالب باسم محدد. سنسجل الوقت اللازم لتنفيذ الاستعلام باستخدام وحدة الزمن في Python لقياس الأداء.

import sqlite3
import time


def query_without_index(search_name):
    """Query the Students table by name without an index and measure the time taken."""

    # الاتصال بقاعدة البيانات باستخدام 'with'
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # قياس وقت البدء
        start_time = time.perf_counter_ns()

        # تنفيذ استعلام البحث عن طالب بالاسم
        cursor.execute('''
        SELECT * FROM Students WHERE name = ?;
        ''', (search_name,))

        # استرداد جميع النتائج (يجب أن يكون هناك نتيجة واحدة أو قليلة في الواقع)
        results = cursor.fetchall()

        # قياس وقت الانتهاء
        end_time = time.perf_counter_ns()

        # حساب الوقت الإجمالي المستغرق
        elapsed_time = (end_time - start_time) / 1000

        # عرض النتائج والوقت المستغرق
        print(f"Query completed in {elapsed_time:.5f} microseconds.")
        print("Results:", results)


# مثال: البحث عن طالب بالاسم
query_without_index('Ojasvi Dhawan')

ها هو الناتج:

Query completed in 1578.10000 microseconds.
Results: [(104, 'Ojasvi Dhawan', 21, '[email protected]')]

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

نستخدم time.perf_counter_ns() لقياس الوقت المستغرق لتنفيذ الاستعلام بالنانوثانية. هذه الطريقة دقيقة للغاية لقياس فترات زمنية صغيرة. نحول الوقت إلى ميكروثانية (us) لسهولة القراءة.

تقديم خطة الاستعلام

عند العمل مع قواعد البيانات، فإن فهم كيفية تنفيذ الاستعلامات يمكن أن يساعدك على تحديد العقبات التي تؤدي إلى إنخفاض الأداء وتحسين شفرتك. يوفر SQLite أداة مفيدة لهذا تُدعى EXPLAIN QUERY PLAN، والتي تسمح لك بتحليل الخطوات التي يتخذها SQLite لاسترجاع البيانات.

في هذا القسم، سنقدم كيفية استخدام EXPLAIN QUERY PLAN لتصور وفهم طريقة عمل الاستعلام—بالتحديد، كيفية أداء SQLite لاستعراض الجدول الكامل عند عدم وجود فهرس.

دعونا نستخدم EXPLAIN QUERY PLAN لرؤية كيفية استرجاع SQLite للبيانات من جدول Students بدون أي فهارس. سنبحث عن طالب بالإسم، وخطة الاستعلام ستكشف عن الخطوات التي يتخذها SQLite لإيجاد الصفوف المطابقة.

import sqlite3


def explain_query(search_name):
    """Explain the query execution plan for a SELECT query without an index."""

    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # استخدم EXPLAIN QUERY PLAN لتحليل كيفية تنفيذ الاستعلام
        cursor.execute('''
        EXPLAIN QUERY PLAN
        SELECT * FROM Students WHERE name = ?;
        ''', (search_name,))

        # جلب وعرض خطة الاستعلام
        query_plan = cursor.fetchall()

        print("Query Plan:")
        for step in query_plan:
            print(step)


# مثال: تحليل خطة الاستعلام للبحث بالإسم
explain_query('Ojasvi Dhawan')

عند تشغيل هذه الشفرة، سيعيد SQLite تحليل كيفية تنفيذ الاستعلام. وهذا ما قد يبدو عليه مثال للإخراج:

Query Plan:
(2, 0, 0, 'SCAN Students')

هذا يشير إلى أن SQLite يبحث في جدول Students الكامل (استعراض الجدول الكامل) لإيجاد الصفوف التي تطابق القيمة الموجودة في العمود name (‏Ojasvi Dhawan‏). وبما أنه لا يوجد فهرس على عمود name، يتوجب على SQLite النظر في كل صف من الجدول.

كيفية إنشاء فهرس

إن خلق المؤشر على عمود يسمح لل SQLite بإيجاد الأسطر بسرعة أكبر خلال عمليات التساوير. بدلاً عن مراجعة الجميع من تلك الجداول، يمكن لل SQLite أستخدام المؤشر للتوجه مباشرة إلى الأسطر المهمة، مما يسرع بشكل كبير التساوير — وخاصة التي تتضمن أعدادات كبيرة.

لخلق المؤشر، يمكنك استخدام الأوامر الSQL التالية:

CREATE INDEX IF NOT EXISTS index-name ON table (column(s));

في هذا المثال، سنقوم بخلق مؤشر على عمود name للجدول Students. هذا كيف يمكنك فعل ذلك باستخدام Python:

import sqlite3
import time


def create_index():
    """Create an index on the name column of the Students table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # الأوامر الSQL لخلق المؤشر على عمود name
        create_index_query = '''
        CREATE INDEX IF NOT EXISTS idx_name ON Students (name);
        '''

        # قياس وقت البدء
        start_time = time.perf_counter_ns()

        # تنفيذ الأوامر الSQL لخلق المؤشر
        cursor.execute(create_index_query)

        # قياس وقت البدء
        end_time = time.perf_counter_ns()

        # تأكيد التغييرات
        connection.commit()

        print("Index on 'name' column created successfully!")

        # حساب الوقت الكلي الذي استغرق
        elapsed_time = (end_time - start_time) / 1000

        # عرض النتائج والوقت الذي استغرق
        print(f"Query completed in {elapsed_time:.5f} microseconds.")


# دعوة الوظيفة لخلق المؤشر
create_index()

الإخراج:

Index on 'name' column created successfully!
Query completed in 102768.60000 microseconds.

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

كيفية سؤال البيانات بواسطة المؤشرات

في هذا القسم سنقوم بتنفيذ نفس الSELECT قوائم البحث التي قمنا بتنفيذها من قبل ، لكن هذه المرة سنستغلل من فائدة الفهرس الذي أنشأناه على عمود name لجدول Students. سنقيس وسجل وقت تنفيذ الأمر للمراجعة للمشاهدة لتحسينات الأداء التي يوفرها الفهرس.

import sqlite3
import time


def query_with_index(student_name):
    """Query the Students table using an index on the name column."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # أوامر السقيلة التي تستخدم لتحديد الطالب بالإسم
        select_query = 'SELECT * FROM Students WHERE name = ?;'

        # قيس وقت تنفيذ الأمر
        start_time = time.perf_counter_ns()  # بدء المنتظر

        # تنفيذ القوائم بإسم الطالب المقدم
        cursor.execute(select_query, (student_name,))
        result = cursor.fetchall()  # جلب جميع النتائج

        end_time = time.perf_counter_ns()  # نهاية المنتظر

        # حساب الوقت المستمر المنصرم بالمجازي
        execution_time = (end_time - start_time) / 1000

        # عرض النتائج ووقت التنفيذ
        print(f"Query result: {result}")
        print(f"Execution time with index: {execution_time:.5f} microseconds")


# مثال: البحث عن طالب بالإسم
query_with_index('Ojasvi Dhawan')

هذا ما نحصل عليه في الخروجية:

Query result: [(104, 'Ojasvi Dhawan', 21, '[email protected]')]
Execution time with index: 390.70000 microseconds

يمكننا ملاحظة تخفيض كبير في وقت تنفيذ الأمر بالمقارنة مع الوقت الذي قمنا به من دون فهرس.

دعونا نحلل خطة تنفيذ القوائم للقوائم مع الفهرس على عمود name لجدول Students. إذا قمت بتنفيذ نفس ال脚本 مرة أخرى لتفسير القوائم ، سوف تحصل على الخروجية التالية:

Query Plan:
(3, 0, 0, 'SEARCH Students USING INDEX idx_name (name=?)')

تظهر الخطة أن القوائم تستخدم الفهرس idx_name، وهو يخفض عدد الأسطر التي يتوجب قراءتها، مما يؤدي إلى تنفيذ أسرع للقوائم.

مقارنة نتائج الأداء

الآن، دعونا نلخص نتائج الأداء التي حصلنا عليها خلال الاستعلام بوجود الفهارس ودونه.

مقارنة وقت التنفيذ

نوع الاستعلام وقت التنفيذ (بالميكروثانية)
دون فهرس 1578.1
مع فهرس 390.7

ملخص تحسين الأداء

  • الاستعلام مع الفهرس أسرع بحوالي 4.04 مرات من الاستعلام دون الفهرس.

  • تحسين وقت التنفيذ بحوالي 75.24% بعد إضافة الفهرس.

أفضل الممارسات لاستخدام الفهارس

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

متى ولماذا تستخدم الفهارس

  1. أعمدة الاستعلامات الشائعة: استخدم الفهارس على الأعمدة التي تستخدم بشكل شائع في الاستعلامات SELECT، خاصة تلك التي تستخدم في بنود WHERE، JOIN، و ORDER BY. هذا بسبب أن ترتيب هذه الأعمدة يمكن أن يقلل بشكل كبير وقت تنفيذ الاستعلام.

  2. قيود الفريدية: عندما تمتلك أعمال يتوجب أن تحمل قيم فريدة (مثل الأسماء المستخدمة أو أيميلات البريد الإلكتروني),تخلق المؤشر يمكن تأكيد هذه القيود بالكفاءة.
  3. قواعد كبيرة: لأجهزة توفر عدد كبير من السجلات، يصبح المؤشرات من الجيد. إنها تمكنك من البحث السريع، وهذا أساسي للحفاظ على الأداء بقدر ما تنمو قدما ترافق بياناتك.
  4. مؤشرات متكاملة: أعتبر خلق مؤشرات متكاملة لأعمال البحث التي تقوم بتصفية أو ترتيب بواسطة أعمال كثيرة. على سبيل المثال، إ

المخاطر المحتملة للمؤشرات

بينما توفير المؤشرات مزايا كبيرة، توجد بعض المخاطر المحتملة:

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

الفهارس أدوات قوية لتحسين استعلامات قاعدة البيانات، ولكنها تتطلب اهتمامًا دقيقًا. العثور على توازن بين تحسين أداء القراءة والعبء المحتمل على عمليات الكتابة أمر أساسي. إليك بعض الاستراتيجيات لتحقيق هذا التوازن:

  • رصد أداء الاستعلام: استخدم EXPLAIN QUERY PLAN في SQLite لتحليل أداء استعلاماتك مع وبدون فهارس. يمكن أن يساعد هذا في تحديد الفهارس التي تعود بالفائدة وتلك التي قد تكون غير ضرورية.

  • صيانة منتظمة: قم بمراجعة فهارسك بانتظام وقيِّم ما إذا كانت ما زالت مطلوبة. احذف الفهارس التي تكررت أو التي نادرا ما يتم استخدامها لتبسيط عمليات قاعدة البيانات الخاصة بك.

  • اختبار وتقييم: قبل تطبيق المؤشرات في بيئة إنتاجية، أجري تجارب شديدة لتفهم تأثيرها على عمليات القراءة والكتابة.

من خلال التبعات هذه الأفضل ممارسات، يمكنك تسخير منافع توزيع المؤشرات وتقليل مخاطرها المحتملة، وفي النهاية تحسين أداء وكفاءة قاعدة SQLite الخاصة بك.

كيف تمتلك خطأ وأعطال

في هذه القسم، سنتحدث عن كيفية معالجة الأخطاء والأعطال عند التعامل بSQLite في Python. التعامل مع الخطأ هو أهمية لحفظ نسقية قاعدة البيانات وضمان أن تتصرف تطبيقك بتوقع.

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

عند التفاعل مع قاعدة SQLite الخاصة بك، قد تكون عدة أخطاء شائعة:

  1. تخطيط قيود: هذا يحدث عندما تحاول إدراج أو تحريك البيانات التي تخلع قيد البيانات، مثل صفقة المؤشر الرئيسي الفريد أو قيود المؤشرات الخارجية. على سبيل المثال، محاولة إ
  2. تعارض أنواع البيانات: محاولة إدراج بيانات خاطئة النوع (على سبيل المثال، إدراج سطر حيث يتوقع رقم) قد توديع لخطأ.

  3. أخطاء قيود القاعدة البيانية: إذا كان يتم كتابة القاعدة البيانية من قبل عملية أخرى أو اتصال آخر، فمحاولة تواصل بها قد تنتج خطأ “القاعدة البيانية مقفولة”.

  4. أخطاء نحوية: أخطاء في نحوية قوائمك الSQL ستسبب خطأ عندما تحاول تنفيذ أوامرك.

كيفية استخدام تعامل الأعطال

تقنيات المعالجة الأعطال في Python (try و except) أساسية لإدارة الأخطاء في المخادم الSQLite. باستخدام هذه البنيات يمكنك مساعدة في تصلب الأعطال والتفاعل بشكل مناسب دون إنهيار برنامجك.

هذا مثال بسيط عن كيفية التعامل مع الأخطاء عند إدخال البيانات في القاعدة:

import sqlite3


def add_customer_with_error_handling(name, balance):
    """Add a new customer with error handling."""
    try:
        with sqlite3.connect('my_database.db') as connection:
            cursor = connection.cursor()
            cursor.execute(
                "INSERT INTO Customers (name, balance) VALUES (?, ?);", (name, balance))
            connection.commit()
            print(f"Added customer: {name} with balance: {balance}")

    except sqlite3.IntegrityError as e:
        print(f"Error: Integrity constraint violated - {e}")

    except sqlite3.OperationalError as e:
        print(f"Error: Operational issue - {e}")

    except Exception as e:
        print(f"An unexpected error occurred: {e}")


# إستخدام مثالي
add_customer_with_error_handling('Vishakha', 100.0)  # صحيح
add_customer_with_error_handling('Vishakha', 150.0)  # إدخال مكرر

في هذا المثال:

  • نصلب IntegrityError, الذي يُطرح لتخطئة مثل القواعد الفريدة.

  • نصلب OperationalError لمشاكل عامة تتصلك بالقاعدة البيانات (مثل أخطاء القفل البياناتي).

  • ولدينا أيضًا قسم except عام للتعامل مع أي أعطال غير متوقع.

المخاطب:

Added customer: Vishakha with balance: 100.0
Error: Integrity constraint violated - UNIQUE constraint failed: Customers.name

أفضل ممارسات لضمان النظام البياناتي.

  1. استخدم العمليات: دائمًا استخدم العمليات (كما تم مناقشته في القسم السابق) عند أداء عمليات متعددة ذات صلة. يساعد ذلك في ضمان نجاح جميع العمليات أو فشلها جميعًا، مما يحافظ على الاتساق.

  2. تحقق من بيانات الإدخال: قبل تنفيذ أوامر SQL، قم بالتحقق من بيانات الإدخال للتأكد من أنها تفي بالمعايير المتوقعة (على سبيل المثال، الأنواع الصحيحة، ضمن النطاقات المسموح بها).

  3. اصطدم بالاستثناءات الخاصة: دائمًا اصطدم بالاستثناءات الخاصة للتعامل بشكل مناسب مع أنواع الأخطاء المختلفة. يتيح ذلك التعامل بشكل أوضح مع الأخطاء وتصحيحها.

  4. سجّل الأخطاء: بدلاً من طباعة الأخطاء فقط على وحدة التحكم، قم بالنظر في تسجيلها في ملف أو نظام مراقبة. سيساعدك هذا على تتبع المشاكل في الإنتاج.

  5. التدهور الرشيق: صمم تطبيقك للتعامل مع الأخطاء بشكل سلس. إذا فشلت عملية ما، قدم تعليقات مفيدة للمستخدم بدلاً من تعطل التطبيق.

  6. النسخ الاحتياطي المنتظم للبيانات: قم بعمل نسخ احتياطية منتظمة لقاعدة البيانات الخاصة بك لمنع فقدان البيانات في حالة حدوث أعطال حرجة أو تلف.

  7. استخدام العبارات المحضرة: تساعد العبارات المحضرة في منع هجمات حقن SQL ويمكن أن توفر أيضًا أداءً أفضل للاستعلامات المتكررة.

كيفية تصدير واستيراد البيانات [قسم إضافي]

في هذا القسم، سنتعلم كيفية تصدير البيانات من قاعدة بيانات SQLite إلى صيغ شائعة مثل CSV وJSON، وكيفية استيراد البيانات إلى SQLite من هذه الصيغ باستخدام Python. هذا مفيد لمشاركة البيانات والنسخ الاحتياطي والتكامل مع التطبيقات الأخرى.

تصدير البيانات من SQLite إلى CSV

يعد تصدير البيانات إلى ملف CSV (القيم مفصولة بفواصل) أمرًا بسيطًا باستخدام مكتبات Python المدمجة. تُستخدم ملفات CSV على نطاق واسع لتخزين وتبادل البيانات، مما يجعلها صيغة مريحة لتصدير البيانات.

كيف تصدر البيانات من جدول SQLite إلى ملف CSV:

import sqlite3
import csv

def export_to_csv(file_name):
    """Export data from the Customers table to a CSV file."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # تنفيذ استعمال استعمال استعمال قيمة للمستخدمين
        cursor.execute("SELECT * FROM Customers;")
        customers = cursor.fetchall()

        # كتابة البيانات إلى CSV
        with open(file_name, 'w', newline='') as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(['ID', 'Name', 'Balance'])  # كتابة البند الرئيسي
            csv_writer.writerows(customers)  # كتابة الأسطر البيانية

        print(f"Data exported successfully to {file_name}.")

# إستعمال مثالي
export_to_csv('customers.csv')

كيف تصدر البيانات الى JSON

بمثابة ذلك يمكنك تصدير البيانات الى ملف JSON (نوتيفار للأيقونات البرمجية)، وهو شكل معروف للتبادل الخاص بالبيانات وخاصة في التطبيقات الإلكترونية.

هذا مثال على كيفية تصدير البيانات الى JSON:

import json
import sqlite3


def export_to_json(file_name):
    """Export data from the Customers table to a JSON file."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        # تنفيذ استعمال استعمال استعمال قيمة للمستخدمين
        cursor.execute("SELECT * FROM Customers;")
        customers = cursor.fetchall()

        # تحويل البيانات الى قائمة من القواميس
        customers_list = [{'ID': customer[0], 'Name': customer[1],
                           'Balance': customer[2]} for customer in customers]

        # كتابة البيانات إلى JSON
        with open(file_name, 'w') as json_file:
            json.dump(customers_list, json_file, indent=4)

        print(f"Data exported successfully to {file_name}.")


# إستعمال مثالي
export_to_json('customers.json')

كيف توفر البيانات الى SQLite من CSV

يمكنك أيضًا توفير البيانات من ملف CSV إلى قاعدة بيانات SQLite. هذا مفيد لتعبئة قاعدة بياناتك بالبيانات القائمة بالفعل.

هذه هي الطريقة التي يمكنك توفير البيانات من ملف CSV:

import csv
import sqlite3


def import_from_csv(file_name):
    """Import data from a CSV file into the Customers table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        فتح ملف CSV للقراءة
        with open(file_name, 'r') as csv_file:
            csv_reader = csv.reader(csv_file)
            next(csv_reader)  تخطي أعمال البند الرئيسي

            أدرج كل سطر في جدول الزبائن
            for row in csv_reader:
                cursor.execute(
                    "INSERT INTO Customers (name, balance) VALUES (?, ?);", (row[1], row[2]))

        connection.commit()
        print(f"Data imported successfully from {file_name}.")


مثال عملية الاستخدام
import_from_csv('customer_data.csv')

كيف تستير بيانات إلى SQLite من JSON

بالمثل، تسهيل تقوم باستيراد البيانات من ملف JSON هو بسيط. يمكنك قراءة ملف JSON وإدراج البيانات في جدولك الSQLite.

هذه هي الطريقة التي يمكنك أن تتمكن منها:

import json
import sqlite3


def import_from_json(file_name):
    """Import data from a JSON file into the Customers table."""
    with sqlite3.connect('my_database.db') as connection:
        cursor = connection.cursor()

        فتح ملف JSON للقراءة
        with open(file_name, 'r') as json_file:
            customers_list = json.load(json_file)

            إدراج كل زبون في جدول الزبائن
            for customer in customers_list:
                cursor.execute("INSERT INTO Customers (name, balance) VALUES (?, ?);", (customer['Name'], customer['Balance']))

        connection.commit()
        print(f"Data imported successfully from {file_name}.")


مثال أستخدام
import_from_json('customer_data.json')

التعامل بالختام

وهذه هي الختام! قمت هذا الدليل بتعريفك بأسس العمل بواسطة SQLite في Python، من تأسيس بيئتك الخاصة إلى التساوير وتغيير البيانات، كذا التصدير والاستيراد البيانات. أتمنى أن أكون مفيداً لكم وأن يثير معياركم لاستخدام SQLite في مشاريعكم.

وحالياً يوجد الوقت لتطبيق معرفتك الجديدة! أنا أشجعك على إنشاء مشروعك بواسطة SQLite وPython. سواء كان تطبيق بسيط لإدارة مكتبك الخاص أو أداة للميزانية، أو أي شيء فريد، الإمكانيات لا تحصى.

وحالما تنتهي مشروعك، شاركه على Twitter وتعريفني! أنا سأحب رؤيته وتحتفل بإنجازك.

يمكنك إيجاد جميع الشيء من الشيء في هذا التوريتال على GitHub. شكرا لكم على التتبع بجنب، وعلى الكود السعيد!

توليد جدول محتويات لمقالاتكم على freeCodeCamp مجانا باستخدام أداة توليد الجدول التفاصيلي.