SQLite هو نظام إدارة قواعد البيانات العلائقية الخفيف والمستقل والمفتوح المصدر. يتميز SQLite بأنه لا يحتاج إلى خادم أو تكوين خاص للعمل، ويمكن تخزين قاعدة البيانات كملف واحد على القرص أو في الذاكرة. SQLite مفيد لتخزين ومعالجة البيانات المحلية أو المضمنة أو الديناميكية بسرعة وكفاءة.
SQLite يوفر مجموعة من الميزات والفوائد الرئيسية، مثل:
- قابلية النقل: يمكن نقل ملف قاعدة البيانات SQLite بسهولة بين الأنظمة المختلفة دون الحاجة إلى تصدير أو استيراد البيانات.
- الموثوقية: SQLite يستخدم آلية السجل اليومي لضمان سلامة البيانات في حالة حدوث فشل أو انقطاع في الطاقة أو الشبكة.
- البساطة: SQLite يتبع نموذج SQL القياسي ويدعم معظم الميزات الشائعة للغة الاستعلام، مثل: الجداول والعمليات والوظائف والفهارس والعرض والانضمام والتجميع والترتيب والتصفية والتحديث والحذف وغيرها.
التوافق: SQLite يمكن دمجه بسهولة مع العديد من لغات البرمجة والأطر والتطبيقات المختلفة، مثل: Python و Java و #C و PHP و Ruby و Android و iOS وغيرها.
Python هي لغة برمجة شائعة وقوية تستخدم لتحليل وتصوير البيانات. توفر بايثون وحدة نمطية مدمجة تسمى `sqlite3` تسمح بالتفاعل مع قواعد البيانات SQLite من البرامج النصية لـ Python. وباستخدام `sqlite3` يمكن للمبرمجين إنشاء والتحقق والكتابة والقراءة والتحديث والحذف من قواعد البيانات SQLite بسهولة وسرعة.
في هذه المقالة، سنوضح كيفية استخدام SQLite مع Python لتخزين البيانات ومعالجتها، باستخدام الأمثلة ومقتطفات التعليمات البرمجية.
كيفية إعداد SQLite على أنظمة التشغيل Windows و Linux و macOS
SQLite هي مكتبة برامج لا تتطلب أي تثبيت أو تكوين. ومع ذلك، لاستخدام SQLite مع بايثون، يحتاج المرء إلى المكونات التالية:
- ملف SQLite الثنائي، وهو ملف واحد قابل للتنفيذ يحتوي على الوظيفة الأساسية لـ SQLite.
- أداة سطر الأوامر `sqlite3`، وهو برنامج يسمح بإنشاء قواعد بيانات SQLite ومعالجتها من خلال الوحدة الطرفية.
- وحدة `sqlite3` الخاصة بـ Python، وهي حزمة توفر واجهة للتفاعل مع قواعد بيانات SQLite من نصوص Python.
وتختلف خطوات تثبيت هذه المكونات وفقًا لنظام التشغيل المستخدم، لذلك نحن في هذا القسم سوف نصف الخطوات لنظام التشغيل Windows و Linux و macOS.
نظام التشغيل Windows
لتثبيت SQLite على نظام التشغيل Windows، يمكن تنزيل البرنامج الثنائي المترجم مسبقًا وأداة سطر الأوامر من موقع SQLite الرسمي. تم تسمية الملفات باسم `sqlite-tools-win64-*.zip` و `sqlite-dll-win32-x86-*.zip`، حيث `*` هو رقم الإصدار.
فبالإمكان استخراج هذه الملفات إلى أي مجلد، مثل: `C:\sqlite`، وإضافة هذا المجلد إلى متغير النظام `PATH`، بحيث يمكن الوصول إلى الأمر `sqlite3` من أي محطة طرفية.
ولتثبيت وحدة `sqlite3` لـ Python على نظام Windows، بالإمكان استخدام الأمر `pip`، وهي أداة تدير حزم Python، فقط افتح سطر الأوامر واكتب الأمر التالي:
سيؤدي هذا الأمر إلى تنزيل وتثبيت حزمة pysqlite3، وهي نسخة فرعية من وحدة `sqlite3` الأصلية التي تدعم أحدث ميزات SQLite.
نظام التشغيل Linux
لتثبيت SQLite على نظام Linux، بالإمكان استخدام مدير الحزم لتوزيعة Linux المستخدمة، مثل: `apt` لتوزيعة Ubuntu أو `yum` لتوزيعة Fedora. فقط افتح موجه الأوامر واكتب الأمر التالي:
أو
سيؤدي هذا الأمر إلى تنزيل وتثبيت برنامج SQLite الثنائي وأداة سطر الأوامر.
الآن لتثبيت وحدة `sqlite3` لـ Python على Linux، يمكن استخدام الأمر `pip` من خلال كتابة الأمر التالي:
سيؤدي هذا الأمر إلى تنزيل وتثبيت حزمة pysqlite3، وهي نسخة فرعية من وحدة `sqlite3` الأصلية التي تدعم أحدث ميزات SQLite.
نظام التشغيل macOS
لتثبيت SQLite على نظام التشغيل macOS، بالإمكان استخدام الأمر `brew`، وهو مدير الحزم لنظام التشغيل macOS. فقط افتح موجه الأوامر واكتب الأمر التالي:
سيؤدي هذا الأمر إلى تنزيل وتثبيت برنامج SQLite الثنائي وأداة سطر الأوامر.
الآن لتثبيت وحدة `sqlite3` لـ Python على نظام التشغيل macOS، بالإمكان استخدام الأمر `pip` من خلال كتابة الأمر التالي:
سيؤدي هذا الأمر إلى تنزيل وتثبيت حزمة pysqlite3، وهي نسخة فرعية من وحدة `sqlite3` الأصلية التي تدعم أحدث ميزات SQLite.
الآن، للتحقق من تثبيت SQLite وعمله بشكل صحيح، بالإمكان استخدام أداة سطر الأوامر `sqlite3`. فقط افتح موجه الأوامر واكتب الأمر التالي:
سيؤدي هذا الأمر إلى تشغيل SQLite Shell، وهو برنامج يسمح بتنفيذ أوامر واستعلامات SQL على قواعد بيانات SQLite. فبالإمكان رؤية إصدار SQLite وبعض المعلومات المفيدة عن طريق كتابة الأمر التالي:
وبالإمكان الخروج من SQLite Shell عن طريق كتابة الأمر التالي:
وللتحقق من أن وحدة `sqlite3` الخاصة بـ Python مثبتة وتعمل بشكل صحيح، فقط افتح موجه الأوامر واكتب الأمر التالي:
سيؤدي هذا الأمر إلى تشغيل Python Shell، وهو برنامج يسمح بتنفيذ أوامر وتعبيرات Python، فيمكنك استدعاء الوحدة `sqlite3` ورؤية نسختها عن طريق كتابة الأوامر التالية في Python Shell:
وفي النهاية يمكنك الخروج من Python Shell عن طريق كتابة الأمر التالي:
كيفية إنشاء جدول قاعدة البيانات في SQLite
جدول قاعدة البيانات عبارة عن مجموعة من البيانات منظمة في صفوف وأعمدة. يمثل كل صف سجلاً أو كيانًا، ويمثل كل عمود سمة أو خاصية للكيان. على سبيل المثال: يمكن لجدول يسمى `students` لتخزين معلومات الطلاب، مثل المعرف والاسم والعمر والصف الدراسي.
لإنشاء جدول قاعدة بيانات في SQLite بالإمكان استخدام عبارة `CREATE TABLE`، التي تحدد الاسم والأعمدة وأنواع بيانات الجدول. وبالإمكان بناء جملة عبارة `CREATE TABLE` كما يلي:
في الأمر السابق `table_name` هو اسم الجدول الذي سيتم إنشاؤه، و `column_1` و `data_type_1` هما أسماء الأعمدة وأنواع بياناتها على التوالي. حيث يدعم SQLite أنواعًا مختلفة من البيانات، مثل: `INTEGER` و `TEXT` و `REAL` و `BLOB` و `NULL`.
على سبيل المثال: لإنشاء جدول يسمى `students` يحتوي على أعمدة `id` و `name` و `age` و `grade`، بالإمكان استخدام الأمر التالي:
سيؤدي هذا إلى إنشاء جدول يسمى `students` بأربعة أعمدة: "المعرف" من نوع بيانات "عدد صحيح"، و"الاسم" من النوع "نص"، و"العمر" من النوع "عدد صحيح"، و"الصف الدراسي" من النوع "حقيقي".
ولعرض تفاصيل الجدول، مثل: الأسماء وأنواع البيانات وقيود الأعمدة، بالإمكان استخدام الأمر `PRAGMA table_info`، الذي يأخذ اسم الجدول كوسيطة. وبناء جملة الأمر `PRAGMA table_info` هو كما يلي:
الوسيط `table_name` هو اسم الجدول المراد فحصه. سوف يعرض الأمر `PRAGMA table_info` مجموعة نتائج مكونة من ستة أعمدة: `cid`، و `name`، و `type`، و `notnull`، و `dflt_value`، و `pk`.
`cid` هو معرف العمود، و `name` هو اسم العمود، و `type` هو نوع البيانات، و `notnull` هي علامة تشير إلى ما إذا كان العمود يحتوي على قيد `NOT NULL`، و `dflt_value` هي القيمة الافتراضية للعمود، و `pk` هي علامة تشير إلى ما إذا كان العمود جزءًا من المفتاح الأساسي.
على سبيل المثال: لعرض تفاصيل جدول `students`، يمكن استخدام الأمر التالي:
سيعيد هذا الأمر مجموعة النتائج مع الصفوف التالية:
pk | dflt_value | notnull | type | name | cid |
---|---|---|---|---|---|
0 | NULL | 0 | INTEGER | id | 0 |
0 | NULL | 0 | TEXT | name | 1 |
0 | NULL | 0 | INTEGER | age | 2 |
0 | NULL | 0 | REAL | grade | 3 |
يوضح هذا أن جدول `students` يحتوي على أربعة أعمدة: "المعرف" و"الاسم" و"العمر" و"الصف" مع أنواع البيانات والقيود الخاصة بكل منها. ولا يحتوي أي من الأعمدة على `NOT NULL` أو قيد مفتاح أساسي، كما لا يحتوي أي منها على قيمة افتراضية.
كيفية الكتابة إلى قاعدة البيانات في SQLite
لكتابة البيانات إلى قاعدة بيانات SQLite من برنامج Python النصي، نحتاج إلى إنشاء اتصال بقاعدة البيانات للربط بين برنامج Python النصي (Python Script) وملف قاعدة بيانات SQLite، مما يتيح إنشاء أوامر SQL وتنفيذها على قاعدة البيانات، بالإضافة إلى تنفيذ المعاملات واستعادتها.
ولإنشاء اتصال بقاعدة بيانات في بايثون، يمكن استخدام الدالة `sqlite3.connect`، والتي تأخذ اسم ملف قاعدة البيانات كوسيطة. فإذا كان الملف غير موجود، فسيتم إنشاؤه تلقائيًا.
وبالإمكان بناء جملة الدالة `sqlite3.connect` كما يلي:
يُعد `conn` متغيرًا يحتفظ بكائن اتصال قاعدة البيانات، و `database_file` هو اسم ملف قاعدة البيانات، مثل: `students.db`.
ولتنفيذ أوامر SQL في قاعدة البيانات نحتاج إلى إنشاء مؤشر، وهو كائن يسمح بتنفيذ أوامر SQL وجلب البيانات من قاعدة البيانات، ويمكن إنشاء المؤشر من اتصال قاعدة البيانات باستخدام التابع `cursor`.
وبالإمكان بناء جملة التابع `cursor` كما يلي:
`cur` هو متغير يحمل كائن المؤشر، و `conn` هو كائن اتصال قاعدة البيانات.
المعاملة عبارة عن مجموعة من أوامر SQL التي يتم تنفيذها كوحدة عمل واحدة. تضمن المعاملة أن تكون قاعدة البيانات في حالة متسقة، حتى إذا فشلت بعض الأوامر أو تمت مقاطعتها. يمكن تنفيذ المعاملة أو التراجع عنها، مما يعني حفظ أو تجاهل التغييرات التي تم إجراؤها بواسطة الأوامر.
ولتنفيذ أوامر SQL باستخدام المؤشر، يمكن استخدام التابع `execute`، الذي يأخذ عبارة SQL كوسيطة.
وبالإمكان بناء جملة التابع `execute` كما يلي:
`cur` هو متغير يحمل كائن المؤشر، و`sql_statement` هو عبارة SQL التي سيتم تنفيذها، مثل `INSERT` أو `UPDATE` أو `DELETE`.
ولتنفيذ معاملة باستخدام اتصال قاعدة بيانات، بالإمكان استخدام التابع `commit`، الذي يحفظ التغييرات التي تم إجراؤها بواسطة أوامر SQL في ملف قاعدة البيانات.
وبالإمكان بناء جملة التابع `commit` كما يلي:
`conn` هو كائن اتصال قاعدة البيانات، فعلى سبيل المثال: لإدراج صف في جدول `students`، الذي يحتوي على أعمدة "المعرف" و"الاسم" و"العمر" و"الصف"، فبالإمكان استخدام الأمر التالي:
سيؤدي هذا الأمر إلى إنشاء اتصال قاعدة بيانات بملف `students.db`، وإنشاء مؤشر، وإدراج صف في جدول `students` بالقيم `Mostafa`، و `18`، و `3.5` للأعمدة `name` و `age` و `grade`، على التوالي، تنفيذ المعاملة والحصول على معرف الصف المدرج الأخير باستخدام السمة `lastrowid` للمؤشر.
تقوم السمة `lastrowid` بإرجاع معرف الصف الأخير الذي تم تعديله بواسطة المؤشر، والذي يمكن أن يكون مفيدًا لتتبع البيانات. سيقوم الكود بطباعة معرف الصف الأخير المدرج، وهو `1` في هذه الحالة.
كيفية القراءة من قاعدة البيانات في SQLite
الاستعلام هو أمر SQL يقوم باسترداد البيانات من قاعدة البيانات. يمكن للاستعلام تحديد الأعمدة والصفوف التي سيتم تحديدها في الجدول، بالإضافة إلى تطبيق عوامل التصفية ووظائف الفرز والتجميع على البيانات.
ولتنفيذ استعلام في بايثون، نحتاج إلى استخدام التابع `execute` لكائن المؤشر الذي تم إنشاؤه من اتصال قاعدة البيانات. يأخذ التابع `execute` عبارة SQL كوسيطة ويرسلها إلى قاعدة البيانات للتنفيذ.
سوف تكون نتيجة الاستعلام عبارة عن مجموعة من الصفوف التي تطابق معايير الاستعلام. ويتم تخزين مجموعة النتائج في كائن المؤشر ويمكن الوصول إليها بطرق مختلفة.
ولجلب البيانات من مجموعة النتائج، يمكننا استخدام التابع `fetchone`، أو `fetchmany`، أو `fetchall` لكائن المؤشر. يقوم التابع `fetchone` بإرجاع صف واحد كصف، ويرجع التابع `fetchmany` قائمة من الصفوف كصفوف، ويرجع التابع `fetchall` جميع الصفوف كقائمة من الصفوف.
فإذا لم يكن هناك المزيد من الصفوف لجلبها، فإن هذه التوابع ترجع `None`، أو قائمة فارغة، فعلى سبيل المثال: للاستعلام عن جدول `students` واختيار اسم وعمر جميع الطلاب، يمكننا استخدام الأمر التالي:
لتصفية البيانات بناءً على معايير معينة، يمكننا استخدام جملة `WHERE` في الاستعلام. تسمح لنا جملة `WHERE` بتحديد شروط الصفوف التي سيتم تحديدها، باستخدام عوامل تشغيل مثل: `=` أو `<` أو `>` أو `LIKE` أو `IN` أو `AND` أو `OR` أو `NOT`.
فعلى سبيل المثال: للاستعلام عن جدول `students` واختيار اسم وعمر الطلاب الذين تزيد أعمارهم عن 18 عامًا ولديهم اسم يبدأ بالحرف `M`، يمكننا استخدام الأمر التالي:
ولفرز البيانات بناءً على عمود واحد أو أكثر، يمكننا استخدام جملة `ORDER BY` في الاستعلام. تتيح لنا جملة `ORDER BY` تحديد الأعمدة والترتيب (تصاعديًا أو تنازليًا) للبيانات التي سيتم فرزها. والترتيب الافتراضي هو تصاعدي، لكن يمكننا استخدام الكلمة الأساسية `DESC` لتحديد الترتيب التنازلي.
فعلى سبيل المثال: للاستعلام في جدول `students` واختيار اسم وأعمار جميع الطلاب، مرتبة حسب العمر بترتيب تنازلي ثم حسب الاسم بترتيب تصاعدي، يمكننا استخدام الأمر التالي:
وللحد من عدد الصفوف التي يرجعها الاستعلام، يمكننا استخدام جملة `LIMIT` في الاستعلام. تسمح لنا جملة `LIMIT` بتحديد الحد الأقصى لعدد الصفوف التي سيتم جلبها من مجموعة النتائج.
فعلى سبيل المثال: للاستعلام في جدول `students` واختيار اسم وعمر أول 10 طلاب، مرتبة حسب العمر بترتيب تنازلي، يمكننا استخدام الأمر التالي:
كيفية تحديث صف في قاعدة البيانات SQLite
التحديث هو أمر SQL يقوم بتعديل البيانات في قاعدة البيانات. يمكن أن يؤدي التحديث إلى تغيير قيم عمود واحد أو أكثر من الجدول لصف معين أو مجموعة من الصفوف التي تطابق معايير معينة.
ولتنفيذ تحديث في بايثون، نحتاج إلى استخدام التابع `execute` لكائن المؤشر، الذي يتم إنشاؤه من اتصال قاعدة البيانات. يأخذ التابع `execute` عبارة SQL كوسيطة ويرسلها إلى قاعدة البيانات للتنفيذ.
ولتنفيذ التحديث في بايثون، نحتاج أيضًا إلى استخدام التابع `commit` لكائن اتصال قاعدة البيانات، والذي يحفظ التغييرات التي تم إجراؤها بواسطة أوامر SQL في ملف قاعدة البيانات.
فعلى سبيل المثال: لتحديث صف في جدول `students`، الذي يحتوي على أعمدة "المعرف" و"الاسم" و"العمر" و"الصف"، يمكننا استخدام الأمر التالي:
سيؤدي هذا الأمر إلى إنشاء اتصال قاعدة بيانات بالملف `students.db`، وإنشاء مؤشر، وتحديث صف الطالب بالمعرف من 1 إلى 4.0، وتنفيذ التحديث، وإغلاق اتصال قاعدة البيانات.
ولتحديد القيم الجديدة للأعمدة وشرط الصف المراد تحديثه، يمكننا استخدام عبارة `UPDATE`، التي تحتوي على الصيغة التالية:
`table_name` هو اسم الجدول المطلوب تحديثه، و `column_1` و `value_1` هما الأسماء والقيم الجديدة للأعمدة المطلوب تحديثها على التوالي، و `condition` هو معيار الصف الذي سيتم تحديثه.
لتعيين قيم جديدة لعمود واحد أو أكثر من الجدول، يمكننا استخدام جملة `SET` في عبارة `UPDATE`. تتيح لنا عبارة `SET` تحديد الأعمدة وقيمها الجديدة، مفصولة بفواصل.
لتحديد الصف المراد تحديثه بناءً على معايير معينة، يمكننا استخدام جملة `WHERE` في عبارة `UPDATE`. وتسمح لنا جملة `WHERE` بتحديد شروط الصف المراد تحديثه، باستخدام عوامل تشغيل مثل: `=` أو `<` أو `>` أو `LIKE` أو `IN` أو `AND` أو `OR` أو `NOT`.
كيفية حذف صف في قاعدة البيانات SQLite
الحذف هو أمر SQL يزيل البيانات من قاعدة البيانات. يمكن أن يؤدي الحذف إلى حذف صف معين أو مجموعة من الصفوف التي تطابق معايير معينة من الجدول.
لتنفيذ عملية حذف في بايثون، نحتاج إلى استخدام التابع `execute` لكائن المؤشر، الذي يتم إنشاؤه من اتصال قاعدة البيانات. يأخذ التابع `execute` عبارة SQL كوسيطة وترسلها إلى قاعدة البيانات للتنفيذ.
ولتنفيذ عملية الحذف في بايثون، نحتاج أيضًا إلى استخدام التابع `commit` لكائن اتصال قاعدة البيانات، والتي تحفظ التغييرات التي تم إجراؤها بواسطة أوامر SQL في ملف قاعدة البيانات.
فعلى سبيل المثال: لحذف صف من جدول `students`، الذي يحتوي على أعمدة "المعرف"، و"الاسم"، و"العمر"، و"الصف"، يمكننا استخدام الأمر التالي:
سيؤدي هذا الأمر إلى إنشاء اتصال قاعدة بيانات بالملف `students.db`، وإنشاء مؤشر، وحذف الصف من جدول `students` بالمعرف 1، وتنفيذ الحذف، وإغلاق اتصال قاعدة البيانات.
ولتحديد شرط الصف المراد حذفه، يمكننا استخدام عبارة `DELETE`، التي تحتوي على الصيغة التالية:
`table_name` هو اسم الجدول الذي سيتم الحذف منه، و `condition` هي معايير الصف الذي سيتم حذفه، باستخدام عوامل تشغيل مثل: `=` أو `<` أو `>` أو `LIKE` أو `IN` أو `AND` أو `OR` أو `NOT`.
لتحديد الصف المراد حذفه بناءً على معايير معينة، يمكننا استخدام جملة `WHERE` في عبارة `DELETE`. فتسمح لنا جملة `WHERE` بتحديد شروط الصف المراد حذفه، باستخدام عوامل تشغيل مثل: `=` أو `<` أو `>` أو `LIKE` أو `IN` أو `AND` أو `OR` أو `NOT`.
خاتمة
لقد أظهرنا في هذه المقالة كيفية استخدام SQLite مع Python لتخزين البيانات ومعالجتها، حيث تعد SQLite وPython أدوات قوية ومتعددة الاستخدامات لتخزين البيانات ومعالجتها.
ومع ذلك، لاستخدامها بفعالية وكفاءة نحتاج إلى اتباع بعض النصائح وأفضل الممارسات، مثل:
- استخدم الاستعلامات ذات المعلمات لتجنب هجمات حقن SQL وتحسين الأداء. تسمح لنا الاستعلامات ذات المعلمات بتمرير القيم إلى عبارات SQL كعناصر نائبة، والتي يتم استبدالها بعد ذلك بالقيم الفعلية في وقت التنفيذ. وهذا يمنع الإدخال الضار أو الخاطئ من التأثير على بناء جملة SQL ومنطقه. ولاستخدام الاستعلامات ذات المعلمات في بايثون، يمكننا استخدام الرمز `?` كعنصر نائب وتمرير مجموعة من القيم كوسيط ثانٍ للتابع `execute`.
- التعامل مع الأخطاء والاستثناءات بأمان. الأخطاء والاستثناءات أمر لا مفر منه عند العمل مع قواعد البيانات، ونحن بحاجة إلى التعامل معها بشكل صحيح لتجنب فقدان البيانات أو الفساد. للتعامل مع الأخطاء والاستثناءات في بايثون، يمكننا استخدام كتلة `try-except-finally`، والتي تسمح لنا بتنفيذ بعض التعليمات البرمجية، والتقاط ومعالجة أي أخطاء أو استثناءات تحدث، وتنفيذ بعض إجراءات التنظيف بغض النظر عن النتيجة.
- إغلاق اتصال قاعدة البيانات بشكل صحيح. يعد اتصال قاعدة البيانات موردًا محدودًا وقيمًا يجب إصداره عند عدم الحاجة إليه. لإغلاق اتصال قاعدة البيانات في بايثون، يمكننا استخدام التابع `close` لكائن اتصال قاعدة البيانات. سيؤدي هذا أيضًا إلى إغلاق أي كائنات المؤشر المرتبطة بالاتصال. كما سيؤدي إغلاق اتصال قاعدة البيانات إلى ضمان حفظ التغييرات في ملف قاعدة البيانات ومنع أي تسرب للذاكرة أو أخطاء.
ولمعرفة المزيد حول SQLite و Python، بالإمكان الرجوع إلى بعض المصادر أو المراجع الإضافية، مثل:
- التوثيق الرسمي لـ SQLite
- التوثيق الرسمي لوحدة `sqlite3` للغة بايثون
- برنامج تعليمي حول كيفية استخدام SQLite مع Python
إضافة تعليق