العلاقات وعمليات الربط
نمذج الجداول المرتبطة
العلاقات وعمليات الربط درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
الجداول المرتبطة
البيانات الواقعية مترابطة: فللمؤلف كتب عديدة، وللطلب عناصر عديدة. وتمثّل SQLAlchemy هذه الروابط باستخدام العلاقات والمفاتيح الخارجية.
# Author 1 --- many --- Book
# A foreign key on Book points back to Author
print('One-to-many is the most common link')المفاتيح الخارجية
يخزّن عمود المفتاح الخارجي المفتاح الأساسي لصف مرتبط. صرّح عنه باستخدام ForeignKey('table.column').
from sqlalchemy import ForeignKey
from sqlalchemy.orm import Mapped, mapped_column
# author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
print('ForeignKey links child to parent')تعريف الأصل
يستخدم نموذج الأصل relationship() للاحتفاظ بمجموعة من العناصر التابعة.
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
from typing import List
class Base(DeclarativeBase):
pass
class Author(Base):
__tablename__ = 'authors'
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str]
books: Mapped[List['Book']] = relationship(back_populates='author')
print('Author.books holds related Book objects')تعريف العنصر التابع
يحتوي نموذج العنصر التابع على عمود المفتاح الخارجي، بالإضافة إلى relationship() يشير مجددًا إلى الأصل.
from sqlalchemy import ForeignKey
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship
class Base(DeclarativeBase):
pass
class Book(Base):
__tablename__ = 'books'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
author_id: Mapped[int] = mapped_column(ForeignKey('authors.id'))
author: Mapped['Author'] = relationship(back_populates='books')
print('Book.author points to its parent')back_populates
يربط back_populates العلاقتين معًا، بحيث ينعكس تحديث أحد الجانبين تلقائيًا على الجانب الآخر.
# author.books.append(book) also sets book.author = author
# Both sides stay in sync automatically
print('back_populates keeps both sides consistent')التنقل بين العلاقات
بعد الربط، يمكنك اجتياز العلاقة مثل السمات العادية: إذ إن author.books قائمة، وbook.author هو كائن الأصل.
# for book in author.books:
# print(book.title)
# print(book.author.name)
print('Navigate with plain attribute access')بناء رسم بياني
أضف العناصر التابعة إلى مجموعة الأصل. تؤدي إضافة الأصل إلى الجلسة إلى تطبيق الانتقال المتسلسل على العناصر التابعة.
# a = Author(name='Rowling')
# a.books.append(Book(title='Book 1'))
# session.add(a)
# session.commit() # author and book both saved
print('Cascade saves the whole object graph')عمليات الضمّ الضمنية
يؤدي الوصول إلى book.author إلى تحميل SQLAlchemy للصف المرتبط تلقائيًا، أي باستخدام التحميل الكسول، في الخلفية.
# Accessing book.author runs a SELECT if not loaded yet
# This is lazy loading
print('Lazy loading fetches related rows on access')عمليات الضمّ الصريحة
لتصفية البيانات عبر الجداول، استخدم join() في استعلام select. فهذا ينشئ عملية SQL JOIN.
from sqlalchemy import select
# stmt = select(Book).join(Author).where(Author.name == 'Rowling')
# books = session.scalars(stmt).all()
print('join(Author) filters across the relationship')التحميل الاستباقي
لتجنب تنفيذ العديد من الاستعلامات الصغيرة، حمّل الصفوف المرتبطة مسبقًا باستخدام joinedload أو selectinload.
from sqlalchemy import select
from sqlalchemy.orm import selectinload
# stmt = select(Author).options(selectinload(Author.books))
print('selectinload preloads children in one extra query')علاقة متعدد إلى متعدد
في روابط متعدد إلى متعدد، يربط جدول اقتران بين الجانبين. وتستخدم relationship() الوسيطة secondary= للإشارة إليه.
# students <-> courses via a 'enrollments' association table
# courses: Mapped[List['Course']] = relationship(secondary=enrollments)
print('secondary= models many-to-many')اختبار سريع
اختبر معرفتك بالعلاقات.
مراجعة
تعلّمت نمذجة الجداول المرتبطة.
- يخزّن
ForeignKeyالرابط في عمود العنصر التابع - تربط
relationship()معback_populatesبين الجانبين - يمكنك التنقل بين الروابط كسمات عادية، ويجلب التحميل الكسول البيانات عند الوصول إليها
- تُجري
join()التصفية عبر الجداول، ويحمّلselectinloadالبيانات استباقيًا، بينما تتولىsecondary=علاقات متعدد إلى متعدد
الأسئلة الشائعة
هل درس «العلاقات وعمليات الربط» مجاني؟
نعم — نص درس «العلاقات وعمليات الربط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «العلاقات وعمليات الربط»؟
نمذج الجداول المرتبطة تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «العلاقات وعمليات الربط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- SQLAlchemy Core مقابل ORM
- تعريف النماذج
- الاستعلام باستخدام Session
- العلاقات وعمليات الربط