دليل البدء مع Firebase باستخدام Python: إنشاء قاعدة بيانات Realtime وتنفيذ CRUD

دقائق القراءة: 6

مقدمة إلى Firebase مع Python

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

في هذا الدليل العملي، ستتعلم كيفية إعداد Firebase Realtime Database وربطها مع Python، ثم تنفيذ العمليات الأساسية على البيانات مثل الإضافة والقراءة والتحديث والحذف. الهدف هنا ليس فقط نقل الخطوات، بل تقديم شرح واضح ومفيد يساعدك على بناء فهم حقيقي يمكن الاعتماد عليه في مشاريعك.

واجهة توضيحية للبدء باستخدام Firebase مع Python وإدارة قاعدة بيانات Realtime

ما هو Firebase ولماذا يستخدمه المطورون؟

تقدم Firebase مفهوم BaaS أو Backend as a Service، أي أنها توفر لك معظم احتياجات الواجهة الخلفية كخدمة جاهزة. وهذا يعني أنك تستطيع التركيز على منطق التطبيق وتجربة المستخدم بدلاً من الانشغال بإعداد الخوادم والتوسع والصيانة.

من أبرز خدمات المنصة:

  • Realtime Database لتخزين البيانات ومزامنتها لحظياً.
  • Cloud Firestore كقاعدة بيانات حديثة مرنة وقابلة للتوسع.
  • Authentication لإدارة تسجيل الدخول والمستخدمين.
  • الاستضافة السحابية.
  • واجهات وخدمات ذكية مثل التعرف على النصوص وتصنيف الصور.

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

كيفية إنشاء Firebase Realtime Database

إنشاء مشروع جديد على Firebase

ابدأ بإنشاء مشروع جديد من لوحة تحكم Firebase. يمكنك مثلاً تسميته BookStoreProject. بعد اكتمال إنشاء المشروع، انتقل إلى قسم Realtime Database ثم اختر Create Database.

إنشاء قاعدة بيانات Realtime من لوحة تحكم Firebase

اختيار الموقع وقواعد الأمان

عند إنشاء قاعدة البيانات، سيُطلب منك تحديد موقع الاستضافة الجغرافي، ثم اختيار إعدادات الحماية. ستجد غالباً خيارين:

  • الوضع المقفل: يمنع جميع عمليات القراءة والكتابة.
  • وضع الاختبار: يسمح بالقراءة والكتابة لمدة افتراضية تصل إلى 30 يوماً.

ولأننا سنجري عمليات إضافة وتعديل وقراءة أثناء الشرح، فإن test mode هو الأنسب في مرحلة التعلم. لكن في المشاريع الحقيقية يجب مراجعة قواعد الأمان بعناية قبل الإطلاق.

بعد هذه الخطوة تصبح قاعدة البيانات جاهزة للاستخدام.

ربط Firebase مع Python

تثبيت مكتبة الإدارة

للتعامل مع قاعدة البيانات من خلال Python سنستخدم مكتبة firebase_admin. ابدأ بتثبيتها عبر الأمر التالي:

pip install firebase_admin

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

بعد تثبيت المكتبة، ستحتاج إلى تهيئة الاتصال عبر Admin SDK. الشكل الأساسي للاتصال يكون كالتالي:

import firebase_admin

cred_obj = firebase_admin.credentials.Certificate('....path to file')
default_app = firebase_admin.initialize_app(cred_obj, {
    'databaseURL': 'databaseURL'
})

المتطلبات الأساسية قبل تشغيل الكود

هناك عنصران أساسيان يجب توفيرهما حتى يعمل الاتصال بشكل صحيح:

  1. ملف مفتاح حساب الخدمة Service Account Key.
  2. رابط قاعدة البيانات databaseURL.

تسمح Firebase بالوصول إلى واجهات الخادم عبر حسابات خدمة من Google. وللمصادقة، تحتاج إلى ملف مفتاح خاص بصيغة JSON. لذلك يجب توليد هذا الملف من إعدادات المشروع ثم تنزيله وحفظه داخل مشروعك.

إعدادات مشروع Firebase لتوليد مفتاح Service Account بصيغة JSON

يمكنك الحصول على هذا الملف من خلال الذهاب إلى إعدادات المشروع ثم اختيار Generate new private key. بعد ذلك ضع المسار الصحيح للملف داخل الدالة Certificate().

أما قيمة databaseURL فستجدها مباشرة داخل صفحة Realtime Database في لوحة تحكم Firebase.

كيفية الكتابة إلى Firebase Realtime Database باستخدام Python

تحديد المرجع باستخدام reference()

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

from firebase_admin import db

ref = db.reference("/")

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

شكل البيانات المسموح به

تعتمد Realtime Database على بنية JSON، لذلك يجب أن تكون البيانات على شكل أزواج من key-value. إذا كنت تريد مفاتيح فريدة يتم توليدها تلقائياً من النظام، فبإمكانك استخدام الدالة push()، وسنشرحها بعد قليل.

لنفرض أن لدينا بيانات لأربعة كتب في ملف JSON بهذا الشكل:

{
  "Book1": {
    "Title": "The Fellowship of the Ring",
    "Author": "J.R.R. Tolkien",
    "Genre": "Epic fantasy",
    "Price": 100
  },
  "Book2": {
    "Title": "The Two Towers",
    "Author": "J.R.R. Tolkien",
    "Genre": "Epic fantasy",
    "Price": 100
  },
  "Book3": {
    "Title": "The Return of the King",
    "Author": "J.R.R. Tolkien",
    "Genre": "Epic fantasy",
    "Price": 100
  },
  "Book4": {
    "Title": "Brida",
    "Author": "Paulo Coelho",
    "Genre": "Fiction",
    "Price": 100
  }
}

إضافة البيانات باستخدام set()

بعد تجهيز الملف، يمكن تحميله وإرساله إلى قاعدة البيانات باستخدام set():

import json

with open("book_info.json", "r") as f:
    file_contents = json.load(f)

ref.set(file_contents)

تقوم الدالة set() بكتابة البيانات في المرجع المحدد، وإذا كان هناك محتوى سابق في نفس المسار، فسيتم استبداله كاملاً.

بنية البيانات داخل Firebase Realtime Database بعد استخدام set

إضافة بيانات بمفاتيح فريدة عبر push()

توفر Firebase الدالة push() لإنشاء مفتاح فريد تلقائياً لكل عنصر جديد. هذه الطريقة مفيدة جداً عندما تتوقع تعدد عمليات الكتابة على نفس المسار، لأنها تقلل احتمال الكتابة فوق البيانات السابقة.

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

ref = db.reference("/")
ref.set({
    "Books": {
        "Best_Sellers": -1
    }
})

ref = db.reference("/Books/Best_Sellers")

import json
with open("book_info.json", "r") as f:
    file_contents = json.load(f)

for key, value in file_contents.items():
    ref.push().set(value)

شكل قاعدة البيانات بعد إدخال السجلات باستخدام push في Firebase

ملاحظة مهمة حول push() وset()

من المهم الانتباه إلى أن push() وset() ليسا عمليتين ذريتين atomic. هذا يعني أنه لا يوجد ضمان مطلق بأنهما سينفذان كوحدة واحدة بلا انقطاع. في بعض الحالات، قد يُنشأ المفتاح أولاً بينما لا تكون القيمة قد كُتبت بعد، لذلك عند القراءة أثناء التحديث قد تظهر مفاتيح موجودة دون بيانات مكتملة.

تحديث البيانات في Firebase باستخدام Python

تحديث البيانات عملية مباشرة. كل ما عليك فعله هو تحديد المرجع الصحيح ثم استخدام الدالة update().

في المثال التالي، سنفترض أن كتب الكاتب J.R.R. Tolkien أصبحت بسعر 80 بدلاً من السعر السابق:

ref = db.reference("/Books/Best_Sellers/")
best_sellers = ref.get()
print(best_sellers)

for key, value in best_sellers.items():
    if value["Author"] == "J.R.R. Tolkien":
        value["Price"] = 90
        ref.child(key).update({"Price": 80})

تعتمد الفكرة هنا على:

  • جلب البيانات عبر get().
  • المرور على العناصر.
  • فحص قيمة الحقل Author.
  • تعديل الحقل المطلوب عبر update().

تحديث أسعار الكتب داخل Firebase Realtime Database باستخدام update

قراءة البيانات والاستعلام عنها من Firebase

سبق أن استخدمنا الدالة get() لجلب البيانات، لكنها ليست الخيار الوحيد. توفر Firebase Realtime Database مجموعة جيدة من أدوات الاستعلام التي تساعدك في ترتيب السجلات وتصفيتها واختيار نطاقات محددة منها.

الترتيب باستخدام order_by_child()

إذا أردت ترتيب الكتب بحسب السعر، يمكنك استخدام order_by_child(). لكن قبل ذلك، من الأفضل تعريف الحقل المفهرس داخل قواعد الأمان باستخدام .indexOn حتى تعمل الاستعلامات بكفاءة.

إعداد فهرسة الحقول باستخدام indexOn في قواعد Firebase

بعد ذلك يمكنك تنفيذ الاستعلام بالشكل التالي:

ref = db.reference("/Books/Best_Sellers/")
print(ref.order_by_child("Price").get())

تعيد هذه العملية غالباً كائناً من نوع OrderedDict يحافظ على الترتيب الناتج من الاستعلام.

أمثلة مفيدة على الاستعلامات

إليك بعض الأمثلة العملية الشائعة:

  • الترتيب حسب المفتاح باستخدام order_by_key().
  • أعلى سعر باستخدام limit_to_last(1).
  • أقل سعر باستخدام limit_to_first(1).
  • المطابقة الدقيقة لقيمة محددة باستخدام equal_to().
ref.order_by_child("Price").limit_to_last(1).get()
ref.order_by_child("Price").limit_to_first(1).get()
ref.order_by_child("Price").equal_to(80).get()

هذه الأدوات تمنحك مرونة كبيرة عند بناء لوحات عرض أو فلاتر أو تقارير تعتمد على البيانات المخزنة داخل التطبيق.

حذف البيانات من Firebase باستخدام Python

حذف البيانات أيضاً عملية بسيطة. في المثال التالي سنحذف الكتب المصنفة ضمن Best_Sellers والتي يكون مؤلفها J.R.R. Tolkien:

ref = db.reference("/Books/Best_Sellers")

for key, value in best_sellers.items():
    if value["Author"] == "J.R.R. Tolkien":
        ref.child(key).set({})

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

حذف سجلات من Firebase Realtime Database باستخدام Python

أفضل ممارسات عند استخدام Firebase مع Python

  • لا تستخدم test mode في بيئة الإنتاج.
  • احفظ ملف Service Account JSON بعيداً عن المستودعات العامة مثل GitHub.
  • صمم بنية JSON بعناية لتقليل التكرار وتسهيل الاستعلام.
  • استخدم الفهارس مثل .indexOn لتحسين الأداء عند الاستعلام.
  • اختبر تأثير عمليات set() لأنها قد تستبدل بيانات كاملة في نفس المسار.
  • فضّل push() عندما تحتاج إلى سجلات متعددة بمفاتيح فريدة.

متى تختار Realtime Database؟

يكون هذا الخيار مناسباً عندما تحتاج إلى:

  • تحديثات لحظية مباشرة بين المستخدمين.
  • مشاريع أولية أو نماذج سريعة MVP.
  • تطبيقات دردشة أو تعقب مباشر أو لوحات حالة حية.

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

الخلاصة التقنية

يوفر الجمع بين Firebase Realtime Database وPython حلاً عملياً وسريعاً لبناء تطبيقات تعتمد على بيانات متزامنة وسهلة الإدارة. من الناحية التقنية، تعد الدوال set() وpush() وupdate() وget() أساس التعامل اليومي مع البيانات، لكن الاستخدام الاحترافي يتطلب الانتباه إلى بنية البيانات، وقواعد الأمان، والفهرسة، وطبيعة التزامن أثناء الكتابة. إذا أتقنت هذه الأساسيات، فستتمكن من بناء طبقة خلفية فعالة دون تعقيد كبير.

اترك تعليقاً

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