قواعد البيانات SQLite والبايثون - كيف تُنشئ قاعدة بيانات وتتعامل معها

قواعد البيانات SQLite والبايثون – كيف تُنشئ قاعدة بيانات وتتعامل معها

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

ما هي قاعدة البيانات SQLite ؟

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

SQLite هي أحد أشهر أنواع قواعد البيانات مفتوحة المصدر غير المعقدة والتي يتم حفظ جميع تفاصيلها (من تعريف الجداول وحتى البيانات) داخل ملف واحد. تم بناء قاعدة البيانات باستخدام لغة C مما يُفسر السرعة العالية في التعامل معها. يُمكنك تحميل SQLite من خلال الرابط التالي:

تحميل قواعد بيانات SQLite

كما يُمكنك الإطلاع على الشيفرة البرمجية المفتوحة لها من خلال الرابط التالي:

الشيفرة المفتوحة لقاعدة بيانات SQLite

ولكن من المهم التنبيه أننا عند التعامل مع بايثون، لن نحتاج لتحميل SQLite، فهي مُضمنة تلقائيًا منذ الإصدار 2.5.

اقرأ أيضًا: لغة بايثون للمبتدئين – سلسلة بايثونات

 

database relationships

مميزات SQLite

  1. خفيفة: يُمكن تضمينها واستخدامها في أجهزة الجوال، التلفزيونات الذكية، الأجهزة والقطع الالكترونية البيتية، الكاميرات الذكية وما إلى ذلك.
  2. أداء عالي: لديها سرعة عالية في القراءة والكتابة، فهي 35% أسرع من القراءة والكتابة من ملفات النظام العادية، كما أنها تُحمل البيانات فقط وقت الحاجة إليها.
  3. لا تحتاج عملية تثبيت: حيث لا تحتاج إلى إعدادات او عملية تثبيت، كُل ما هو مطلوب هو أن تُحمل الملفات الخاصة بها على جهازك الحاسوب وبعدها يُمكن استخدامها بكل سهولة.
  4. الاعتمادية: تقوم SQLit بتحديث البيانات أولًا بأول، وبذلك، قد تضيع بيانات قليلة عند حدوث فشل النظام وتعطله فجأة (وقد لا تفقد بيانات من الأساس).
  5. لغات برمجة عديدة: أغلب لغات البرمجة تُقدم الإمكانيات اللازمة للتعامل مع قاعدة بيانات SQLite.

كما يُوجد العديد من المميزات الأخرى التي نتركها لكم للتعرف عليها أثناء استخدامكم الفعلي لقاعدة بيانات SQLite.

ما الذي لا تقدمه SQLite ؟

SQLite مناسبة لبعض الحالات العملية، ولكنها غير مناسبة ولا يصلح استخدامها في بعض الحالات الأخرى. النقاط التالية تُوضح لك بعض العيوب:

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

إنشاء قاعدة SQLite بيانات في البايثون

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

import sqlite3

تعمل الدالة connect على إعادة عنصر من نوع Connection الذي يُمثل قناة الاتصال مع قاعدة البيانات، ويحتوي العديد من الخصائص والدوال التي نستخدمها في تعاملنا مع قاعدة البيانات. لإنشاء قاعدة البيانات، نُمرر للدالة connect المسار الخاص بقاعدة البيانات + الاسم، وعند استدعاءها سيتم انشاء قاعدة البيانات اذا لم تكن منشأة من قبل في المسار، واذا كانت موجودة من قبل، فسيتم فتح قناة الاتصال معها:

# إنشاء قاعدة البيانات
connection = sqlite3.connect('myDB.db')

بعد تنفيذ السطر السابق، وبإفتراض أنه لا يُوجد ملف قاعدة بيانات باسم myDB.db في المسار الحالي، سيتم انشاء ملف قاعدة البيانات.

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

CREATE TABLE table_name (
    column1 datatype [constraint],
    column2 datatype [constraint],
    column3 datatype [constraint],
   ....
);

لتنفيذ أمر انشاء جدول جديد بداخل قاعدة البيانات التي أنشأنها باسم myDB.db، نٌعرف في البداية ما يُسمى cursor وهو الكائن المسؤول عن تنفيذ جُمل SQL  والتعامل مع النتائج. يُوجد عدة دوال يُمكن استخدمها من خلال cursor لتنفيذ جُمل SQL والتعامل مع نتائجها.

المثال التالي يُوضح كيفية إنشاء قاعدة بيانات جديدة باسم Pythonat ثم إنشاء جدول باسم Article. بعد إنشاء الجدول، نستعلم عن الجداول الموجودة في قاعدة البيانات، للتأكد من وجود الجدول الجديد:

import sqlite3 as sq

#إنشاء قاعدة البيانات 
con = sq.connect('pythonat.db')

# تعريف cursor
cur = con.cursor()

#تعريف جدول المقالات
# Artcile
create_command = '''CREATE TABLE article ( 
	    	 article_id INTEGER PRIMARY KEY,
		     article_txt TEXT NOT NULL)'''

cur.execute(create_command)
		   
	
# التأكد من إنشاء الجدول عبر الاستعلام عن الجداول الموجودة
cur.execute("""SELECT 
				name 
			 FROM 
				sqlite_master 
			 WHERE 
				type ='table' AND  
				name NOT LIKE 'sqlite_%' """)
print(cur.fetchall())

#اغلاق cursor
cur.close()
		   

عند إنشاء قاعدة البيانات والجدول بدون أخطاء، ستكون نتيجة الشيفرة البرمجية السابقة كالتالي:

[('article',)]

وبذلك يكون جدول Articles جاهزًا لإدخال البيانات فيه والتعديل عليه.

اقرأ أيضًا: مكتبات علم البيانات بالبايثون – أشهر 5 مكتبات

إجراء عمليات CRUD من خلال البايثون

المقصود بعمليات CRUD هي create, retrieve, update, delete وهي العمليات الأساسية المستخدمة في التعامل مع البيانات داخل قواعد البيانات.

اضافة سجل بيانات لجدول

لإضافة بيانات جديدة في جدول Article نستخدم جملة SQL المُسماة insert into table والصيغة العامة لها هي كالتالي:

INSERT INTO table (column1,column2 ,..)
VALUES( value1,	value2 ,...);

المثال التالي يوضح أمر SQL لإضافة سجل جديد لجدول article:

INSERT INTO article (article_id, article_txt)
VALUES( 1,	'Pythonat article 1');

لتنفيذ الأمر السابق في البايثون، نُسند صيغة الأمر كنوع نصي لمتغير، ثم نُمرر المتغير للدالة execute كما يلي:

insert_command = '''INSERT INTO article (article_id, article_txt) 
                  VALUES( 1, "Pythonat article 1")'''

cur.execute(insert_command)

con.commit()

لتأكيد عملية الإضافة، نُنفذ الدالة commit الموجودة في كائن الإتصال. أوامر commit و rollback هي أوامر SQL للتحكم بـ transaction التي يتم تنفيذها واجراؤها في قاعدة البيانات.

اضافة مجموعة سجلات

أحد الطُرق التي يُمكن استخدامها في اضافة سجلات لجدول ما دفعةً واحدة، هي تكرار جُملة الإضافة لكل سجل داخل حلقة تكرارية، ولكن على ما يبدو أن تلك هي طريقة لا يُحبذها الكثير من المبرمجين، لما قد تُسببه من ارهاق في الكتابة وفهم الشيفرة البرمجية او بسبب عدم الكفاءة. تُقدم الوحدة المعيارية في بايثون sqlite3 خيار تنفيذ جُملة SQL أكثر من مرة بواسطة دالة واحدة واستدعاء واحد وهي دالة executemany. في المثال التالي، نُنشئ قائمة تحتوي سجلات نريد أن نضيفها لجدول Article من خلال دالة executemany:

# السجلات محفوظة في قائمة
data = [
	(2, 'Article #two txt'),
	(3, 'Article #three txt'),
	(4, 'Article #four txt'),
	(5, 'Article #five txt'),
]

cur.executemany('''INSERT INTO article 
                   VALUES (?,?) ''', data
)

con.commit()

تعديل سجل بيانات في جدول

نستخدم لتعديل سجلات جدول ما في SQL جملة update table. الصيغة العامة للجملة كما يلي:

UPDATE table
SET column_1 = new_value_1,
    column_2 = new_value_2
WHERE
    search_condition 
ORDER column_or_expression
LIMIT row_count OFFSET offset;

للتطبيق مثلًا، نريد أم نُعدل عمود article_txt بحيث يُصبح قيمته ‘dummy dummy dummy’ للسجل الذي له article_id يساوي 3. في المثال التالي نحفظ جملة SQL في متغير اسمه update_command ثم نُنفذ الجُملة باستخدام دالة execute:

update_command = '''UPDATE article SET article_txt = "dummy dummy dummy" 
                    WHERE article_id = 3 '''

cur.execute(update_command)

con.commit()

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

الصيغة العامة لأمر الحذف في SQL هي كالتالي:

DELETE FROM table
WHERE search_condition;

في مثالنا، لحذف السجل الذي يمتلك article_id بقيمة 5 مثلًا، نكتب الشيفرة البرمجية التالية:

delete_command = ''' DELETE FROM article
					 WHERE article_id = 5 '''

cur.execute(delete_command)

con.commit()

الإستعلام عن البيانات في SQLite

يُمكن الاستعلام عن محتويات قاعدة البيانات بكل سهولة من خلال جُملة الاستعلام المشهورة في SQL والمُسماة SELECT. لقد فعلنا ذلك في بداية المقال عندما أردنا التأكد من إنشاء الجدول الذي عرَّفناه.

هنا نُضيف مجموعة أخرى من الأمثلة التي تُوضح طريقة الإستعلام عن البيانات في جدول Article بأكثر من طريقة:

# الاستعلام وارجاع نتيجة واحدة
sql_one = ''' SELECT * 
              FROM article
			  WHERE article_id = 1 '''

cur.execute(sql_one)

print( cur.fetchone())

# result => (1, 'Pythonat article 1')

# الاستعلام وارجاع جميع السجلات الناتجة
sql_two = ''' SELECT * 
              FROM article '''

cur.execute(sql_two)

print( cur.fetchall())

# الاستعلام والمرور على النتيجة من خلال حلقة تكرارية
sql_three = ''' SELECT * 
              FROM article
			  WHERE article_id <= 3'''

for row in cur.execute(sql_three):
	print(row)
	
	

 

فتح قاعدة البيانات واستكشافها من خلال DB Browser

لتسهيل العمل، وللتعامل مع مجموعة من قواعد البيانات واستكشاف هيكليتها والتعديل عليها وعلى بياناتها، يُمكنك استخدام الأداة DB Browser For SQLite لذلك.

فتح قاعدة بيانات من خلال أداة db browser

 

استكشاف البيانات في قاعدة بيانات من خلال أداة db browser

اقرأ أيضًا: البرمجة البايثونية – كيف تكتب شيفرة برمجية بالبايثون بطريقة سليمة

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *