JavaRush /Курсы /Модуль 4: FastAPI /Связь SQLAlchemy с Django ORM: различия и сходства

Связь SQLAlchemy с Django ORM: различия и сходства

Модуль 4: FastAPI
6 уровень , 6 лекция
Открыта

Сегодня, однако, нас ждёт интересный сюжет: мы сравним SQLAlchemy с Django ORM. Почему это важно? Потому что знать одну ORM — хорошо, но понимать, как разные системы работают, их сильные и слабые стороны, — это уже ближе к истинному мастерству. А ещё это классный способ блеснуть знаниями на собеседовании.

Для начала давайте вспомним, как расшифровывается аббревиатура ORM.

ORM (Object-Relational Mapping) — это способ соединить мир объектов (объектов Python, Java, или чего угодно) с миром реляционных баз данных (таблиц). ORM позволяет описывать модели в виде классов и работать с записями как с объектами, избавляя вас от необходимости писать SQL вручную.

Ну а теперь сравним SQLAlchemy и Django ORM, как две разные "магии" работы с данными.


Архитектура и подход

SQLAlchemy — это "целенаправленная" ORM, которая предоставляет вам почти полный контроль над тем, как вы строите запросы и взаимодействуете с базой данных. Она состоит из двух частей:

  1. Core: чистая SQL и её абстракции (вы можете вручную писать запросы).
  2. ORM: дополнение, позволяющее работать с моделями, отображая их на таблицы базы данных.

SQLAlchemy требует больше конфигурации и явного кода. Например, для работы вам нужно вручную настроить двигатели (engines), сессии (sessions) и описывать модели.

Django ORM:

Django ORM встроена в Django и предназначена для быстрого и удобного использования. Она "знает", что вы используете Django, и уже настраивает половину всего за вас. Например:

  • Встроенные миграции (никакого Alembic не нужно).
  • Понятная абстракция запросов через менеджеры (objects).
  • Удобная связь между моделями и административным интерфейсом Django.

Django ORM — это "ORM с батарейками": вы пишете меньше кода ценой потери небольшой гибкости.


Запросы к базе данных

Теперь давайте поговорим о том, как "вести переговоры" с базой данных в SQLAlchemy и Django ORM. Здесь начинаются заметные различия.

SQLAlchemy даёт вам прямой контроль над созданием и выполнением запросов. Например, чтобы достать пользователя из базы, вы пишете следующее:


# Пример SQLAlchemy-запроса
from sqlalchemy.orm import Session
from models import User

session = Session(bind=engine)

# Фильтрация по условиям
user = session.query(User).filter(User.name == "Alice").first()
print(user.email)

Вы практически "строите" вашу SQL-логику, используя Python. Это как писать SQL-запросы, только с использованием объектов. Такой подход требует больше усилий, но даёт больше возможностей.

Django делает запросы предельно простыми. Вот аналогичный пример в Django ORM:


# Пример Django ORM-запроса
from myapp.models import User

# Фильтрация по условиям
user = User.objects.filter(name="Alice").first()
print(user.email)

Django ORM напрямую использует менеджеры объектов (objects), упрощая вашу жизнь. Звучит неплохо, правда? Но если запросы становятся сложными, вам придётся погрузиться в документацию Django (или использовать raw() для SQL-магии).


Примеры аналогичных операций в SQLAlchemy и Django ORM

Модели данных

SQLAlchemy требует явного определения моделей и таблиц. Пример модели пользователя:


from sqlalchemy import Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

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

В Django ORM модели выглядят более компактно из-за встроенных упрощений:


from django.db import models

class User(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()

Django автоматически генерирует таблицу для этой модели. SQLAlchemy требует от вас больше ручной работы, но даёт больше контроля.

Связи между моделями

Связи (реляции) в SQLAlchemy определяются явно:


from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

class Post(Base):
    __tablename__ = 'posts'
    id = Column(Integer, primary_key=True)
    title = Column(String(200))
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship('User', back_populates='posts')

И вам также придётся настраивать «обратную связь» у модели User:


class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    posts = relationship('Post', back_populates='user')

В Django ORM связи определяются просто:


class Post(models.Model):
    title = models.CharField(max_length=200)
    user = models.ForeignKey('User', on_delete=models.CASCADE, related_name='posts')

Django автоматически заботится о «обратной связи» (related_name='posts'), так что вам не нужно писать лишний код.

Изменение данных

У SQLAlchemy изменение данных требует управления сессиями:


user = session.query(User).filter(User.name == "Alice").first()
user.email = "new_email@example.com"
session.commit()

В Django ORM достаточно вызвать метод save():


user = User.objects.get(name="Alice")
user.email = "new_email@example.com"
user.save()

Когда использовать SQLAlchemy, а когда — Django ORM?

Используем SQLAlchemy:

  • Проекты на FastAPI или Flask. SQLAlchemy идеально интегрируется с FastAPI и другими фреймворками.
  • Сложные запросы. Если вам нужно выжимать максимум из SQL (например, оптимизировать JOIN'ы), SQLAlchemy предоставит больше инструментария.
  • Гибкость. SQLAlchemy даёт разработчику полный контроль, что важно в нестандартных проектах.

Используем Django ORM:

  • Проекты на Django. Django ORM — это нативная и наиболее удобная ORM для Django-фреймворка.
  • Быстрый старт. Если вы хотите максимально ускорить разработку, встроенные инструменты Django экономят время.
  • Простота. Django ORM легко изучить и использовать, если у вас нет сложных требований к базе данных.

Смешанный подход:

Но что если вы хотите выйти за рамки? Например, использовать SQLAlchemy в проекте Django? Это возможно, хотя и редко встречается. Представьте проект, который использует Django и SQLAlchemy одновременно: Django для простых моделей, а SQLAlchemy для сложных запросов и многобазной архитектуры.


Таким образом, выбор между SQLAlchemy и Django ORM зависит от вашего проекта, требований к базе данных и фреймворка, который вы используете. Оба инструмента — это мощные решения, которые отлично справляются со своими задачами. Каждый из них имеет свои сильные и слабые стороны, и работа с ними — это дело вкуса (и необходимости).

1
Задача
Модуль 4: FastAPI, 6 уровень, 6 лекция
Недоступна
Задача на использование SQLAlchemy
Задача на использование SQLAlchemy
1
Задача
Модуль 4: FastAPI, 6 уровень, 6 лекция
Недоступна
Задача на использование Django ORM
Задача на использование Django ORM
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ