Ответ
Функция relationship
в SQLAlchemy создает связь между двумя ORM-моделями, позволяя работать с ними как с иерархией Python-объектов, а не через ручное написание SQL-запросов с JOIN
. Она является ключевым элементом, который устраняет разрыв между объектно-ориентированной и реляционной парадигмами.
Основные возможности relationship
:
- Объектная навигация: Позволяет легко получать доступ к связанным объектам. Например,
user.posts
вернет список всех постов, принадлежащих пользователю. - Управление загрузкой: Позволяет контролировать, когда загружаются связанные данные. По умолчанию используется "ленивая" загрузка (
lazy='select'
), но можно настроить и "жадную" (lazy='joined'
), чтобы избежать проблемы N+1 запросов. - Каскадные операции: Можно настроить автоматическое выполнение операций (сохранение, удаление) над связанными объектами (например,
cascade="all, delete-orphan"
).
Пример связи "один ко многим" (User -> Post):
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
# Связь "один ко многим": один User может иметь много Post.
# back_populates обеспечивает двустороннюю синхронизацию.
posts = relationship("Post", back_populates="author", cascade="all, delete-orphan")
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String)
user_id = Column(Integer, ForeignKey('users.id'))
# Обратная связь, указывающая на владельца поста.
author = relationship("User", back_populates="posts")
# --- Пример использования (псевдокод) ---
# user = session.query(User).get(1)
# for post in user.posts: # Легкий доступ к постам пользователя
# print(post.title)
# post = session.query(Post).get(5)
# print(post.author.name) # Легкий доступ к автору поста
Таким образом, relationship
абстрагирует работу с внешними ключами и JOIN
-ами, делая код более читаемым, безопасным и объектно-ориентированным.