Каковы основные принципы работы с SQLAlchemy ORM в Python?

«Каковы основные принципы работы с SQLAlchemy ORM в Python?» — вопрос из категории Библиотеки и модули, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SQLAlchemy ORM — это инструмент в Python для взаимодействия с реляционными базами данных с использованием объектно-ориентированного подхода. Он позволяет абстрагироваться от написания SQL-запросов, представляя таблицы как классы, а строки в них — как экземпляры этих классов.

Ключевые компоненты:

  1. Engine: Объект, управляющий пулом соединений с базой данных. Создается один раз для всего приложения.
  2. Декларативное объявление моделей: Классы Python, наследуемые от declarative_base(), которые сопоставляются с таблицами в БД.
  3. Session: Основной интерфейс для работы с ORM. Сессия управляет состоянием объектов (транзакциями), отслеживает изменения и формирует SQL-запросы.

Базовый пример (CRUD):

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

# 1. Определение модели
Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

# 2. Создание Engine и Session
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)  # Создание таблицы
Session = sessionmaker(bind=engine)
session = Session()

# 3. Создание и добавление объекта (Create)
new_user = User(name='Alice')
session.add(new_user)
session.commit()

# 4. Запрос объекта (Read)
# Стиль 1.x (устаревший, но распространенный)
user = session.query(User).filter_by(name='Alice').first()
print(f"Найден пользователь: {user.name}")

# 5. Обновление (Update)
user.name = 'Alice Smith'
session.commit()

# 6. Удаление (Delete)
session.delete(user)
session.commit()

Важные аспекты:

  • Управление транзакциями: Все изменения внутри сессии накапливаются и отправляются в БД только после вызова session.commit(). В случае ошибки session.rollback() отменяет изменения.
  • Отношения: SQLAlchemy позволяет легко определять связи между моделями (one-to-one, one-to-many, many-to-many) с помощью relationship().
  • Оптимизация запросов: Для предотвращения проблемы "N+1" используются стратегии немедленной загрузки связанных данных, например, joinedload() или selectinload().