Ответ
Функция 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-ами, делая код более читаемым, безопасным и объектно-ориентированным.