ترشيح البيانات باستخدام الشروط المنطقية في SQLAlchemy
يعد SQLAlchemy أحد أكثر المكتبات استخدامًا في البرمجة بلغة Python للعمل مع قواعد البيانات العلائقية. توفر هذه المكتبة واجهتين رئيسيتين للعمل مع قواعد البيانات، الأولى هي واجهة الـ Core التي تقدم عمليات SQL منخفضة المستوى، والثانية هي واجهة الـ ORM (Object-Relational Mapping) التي توفر طريقة أكثر تجريدًا للتعامل مع البيانات من خلال الكائنات (objects) بدلاً من الاستعلامات النصية المباشرة.
من خلال استخدام SQLAlchemy ORM، يمكن للمطورين كتابة استعلامات معقدة بسهولة باستخدام شروط منطقية لتصفية البيانات (Filtering). في هذا المقال، سنتناول كيفية استخدام SQLAlchemy لترشيح البيانات بناءً على شروط منطقية مثل المساواة، التفاوت، المقارنات وغيرها من العمليات المنطقية الأساسية.
1. مقدمة في SQLAlchemy ORM
قبل الخوض في الترشيح باستخدام الشروط المنطقية، من المهم أن نفهم كيف يعمل SQLAlchemy ORM. يوفر ORM آلية لربط كائنات Python مع جداول قواعد البيانات. هذا يعني أنه يمكن استخدام الكائنات class التي تمثل الجداول لاستخراج وتحديث البيانات بطريقة كائنية بدلاً من استخدام SQL التقليدي.
pythonfrom sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# إنشاء قاعدة البيانات والاتصال بها
engine = create_engine('sqlite:///:memory:') # قاعدة بيانات مؤقتة في الذاكرة
Base = declarative_base()
# تعريف الجدول في قاعدة البيانات
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
# إنشاء الجداول
Base.metadata.create_all(engine)
# إنشاء جلسة للتفاعل مع قاعدة البيانات
Session = sessionmaker(bind=engine)
session = Session()
في المثال أعلاه، أنشأنا قاعدة بيانات مؤقتة في الذاكرة تحتوي على جدول users مع الأعمدة id و name و age. باستخدام هذه البيانات، سنبدأ في تطبيق عمليات الترشيح باستخدام الشروط المنطقية.
2. استخدام الشروط المنطقية في الترشيح
يمكن ترشيح البيانات باستخدام الشروط المنطقية مثل المساواة و التفاوت و المقارنات مثل “أكبر من” أو “أقل من” أو “في نطاق معين” باستخدام SQLAlchemy ORM.
2.1 المساواة: ==
أبسط أنواع الشروط المنطقية التي يمكن استخدامها هو المساواة. في SQL، يتم تمثيل المساواة باستخدام الكلمة =، وفي SQLAlchemy يمكننا استخدام العامل == لتحقيق نفس النتيجة.
python# إضافة بيانات إلى الجدول
session.add_all([User(name="Ali", age=30), User(name="Ahmed", age=25), User(name="Sara", age=28)])
session.commit()
# استخدام المساواة لترشيح البيانات
users = session.query(User).filter(User.age == 30).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
في هذا المثال، قمنا بإضافة بعض البيانات إلى الجدول وقمنا باستخدام شرط المساواة لترشيح المستخدمين الذين أعمارهم تساوي 30.
2.2 التفاوت: !=
يمكنك أيضًا ترشيح البيانات باستخدام التفاوت أي عندما لا تكون القيم متساوية. في SQLAlchemy، نستخدم العامل != لهذا الغرض.
python# استخدام التفاوت لترشيح البيانات
users = session.query(User).filter(User.age != 25).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
في المثال أعلاه، نقوم بترشيح المستخدمين الذين لا تتساوى أعمارهم مع 25.
2.3 المقارنات: >, <, >=, <=
يمكنك استخدام العديد من المقارنات في SQLAlchemy مثل أكبر من (>)، أقل من (<)، أكبر من أو يساوي (>=)، و أقل من أو يساوي (<=).
python# استخدام المقارنات لترشيح البيانات
users = session.query(User).filter(User.age > 25).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
في هذا المثال، تم ترشيح المستخدمين الذين تزيد أعمارهم عن 25.
2.4 استخدام or_ و and_
في بعض الأحيان، قد تحتاج إلى استخدام العمليات المنطقية مثل أو (OR) و و (AND). يمكن لـ SQLAlchemy مساعدتك في ذلك باستخدام or_ و and_ من مكتبة sqlalchemy:
pythonfrom sqlalchemy import or_, and_
# استخدام أو لترشيح البيانات
users = session.query(User).filter(or_(User.age == 25, User.age == 30)).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
# استخدام و لترشيح البيانات
users = session.query(User).filter(and_(User.age >= 25, User.age <= 30)).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
في المثال الأول، قمنا بترشيح المستخدمين الذين تكون أعمارهم إما 25 أو 30 باستخدام عملية أو، وفي المثال الثاني، قمنا بترشيح المستخدمين الذين تكون أعمارهم بين 25 و 30 باستخدام عملية و.
2.5 استخدام in_ و notin_
لترشيح البيانات بناءً على مجموعة من القيم، يمكننا استخدام دالة in_ في SQLAlchemy. تستخدم هذه الدالة للبحث عن قيم موجودة في قائمة معينة، بينما يمكن استخدام notin_ لاستبعاد القيم الموجودة في القائمة.
python# استخدام in لترشيح البيانات
users = session.query(User).filter(User.age.in_([25, 30])).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
# استخدام notin لترشيح البيانات
users = session.query(User).filter(User.age.notin_([25, 30])).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
3. دمج الشروط المنطقية المتعددة
من الممكن دمج الشروط المنطقية معًا لإنشاء استعلامات أكثر تعقيدًا باستخدام SQLAlchemy. يمكن دمج عدة شروط منطقية في نفس الاستعلام باستخدام دالة filter مع دمج و و أو. سنوضح ذلك في المثال التالي:
python# دمج الشروط المنطقية
users = session.query(User).filter(and_(User.age > 20, or_(User.name == "Ali", User.name == "Ahmed"))).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
في هذا المثال، قمنا بدمج شرطين معًا بحيث نبحث عن المستخدمين الذين تكون أعمارهم أكبر من 20 وفي نفس الوقت يكون اسمهم إما "Ali" أو "Ahmed".
4. استخدام الشروط المنطقية مع order_by
عند ترشيح البيانات، يمكننا أيضًا ترتيب النتائج باستخدام دالة order_by. يمكن دمج الشروط المنطقية مع الترتيب للحصول على نتائج أكثر دقة.
python# استخدام الشرط المنطقي مع ترتيب النتائج
users = session.query(User).filter(User.age > 25).order_by(User.age.desc()).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
5. ترشيح البيانات باستخدام الـ like و ilike
إذا كنت ترغب في البحث عن القيم التي تحتوي على جزء معين من النص، يمكنك استخدام الشروط like أو ilike في SQLAlchemy. يستخدم like للبحث الحساس لحالة الأحرف بينما ilike يستخدم للبحث غير الحساس لحالة الأحرف.
python# استخدام like للبحث الحساس لحالة الأحرف
users = session.query(User).filter(User.name.like("A%")).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
# استخدام ilike للبحث غير الحساس لحالة الأحرف
users = session.query(User).filter(User.name.ilike("a%")).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
6. الترشيح باستخدام is_()
في بعض الأحيان، قد تحتاج إلى استخدام NULL في الاستعلامات. يمكننا استخدام دالة is_() للتحقق من القيم الفارغة NULL.
python# استخدام is_ للتحقق من NULL
users = session.query(User).filter(User.age.is_(None)).all()
# عرض النتائج
for user in users:
print(user.name, user.age)
7. استنتاج
باستخدام SQLAlchemy، يمكن ترشيح البيانات باستخدام شروط منطقية متعددة بطريقة مرنة وفعّالة. توفر المكتبة مجموعة واسعة من الأدوات التي تجعل من السهل

