Этот вопрос проверяет практический опыт работы с базой данных и понимание компромиссов между удобством ORM и контролем raw SQL.
ORM используют для ускорения разработки и упрощения работы с базой данных, а raw SQL — когда нужен полный контроль над запросами. В реальных проектах часто применяют оба подхода: ORM для типовых CRUD-операций, raw SQL — для сложных или критичных по производительности запросов. Важно понимать, как ORM формирует SQL, чтобы избегать лишних запросов и проблем с производительностью. Опытный разработчик выбирает инструмент исходя из задачи, а не “по привычке”.
На практике вопрос редко стоит как “или ORM, или raw SQL”. Обычно речь идёт о разумном сочетании этих подходов.
ORM (Object-Relational Mapping) — это слой, который позволяет работать с таблицами базы данных через объекты и классы языка программирования, скрывая явный SQL.
ORM хорошо подходит для большинства стандартных задач:
CRUD-операции
Создание, чтение, обновление и удаление записей.
Код получается короче и понятнее.
Работа с моделями и связями
Связи один-к-одному, один-ко-многим.
Удобная навигация по объектам.
Быстрая разработка
Меньше шаблонного кода.
Проще поддерживать и читать.
Пример идеи (упрощённо):
user = User.objects.get(id=1)
user.email = "new@mail.com"
user.save()
Raw SQL выбирают, когда ORM становится ограничением:
Сложные запросы
Много JOIN, подзапросы, оконные функции.
Оптимизация производительности
Нужно строго контролировать план выполнения запроса.
Массовые операции
Bulk insert/update, сложные агрегации.
Специфичные возможности БД
Расширения, нестандартные типы данных, хинты.
Пример:
cursor.execute(
"SELECT id, count(*) FROM orders GROUP BY id HAVING count(*) > 10"
)
N+1 запрос — множество лишних обращений к БД.
Сложно понять, какой SQL реально выполняется.
Иллюзия “бесплатных” операций, которые на деле дорогие.
ORM — основной инструмент.
Raw SQL — осознанное исключение.
Понимание SQL обязательно, даже при активном использовании ORM.
ORM ускоряет разработку и упрощает код, а raw SQL нужен для сложных и критичных случаев — в реальных проектах почти всегда используют оба подхода.