Sobes.tech
Назад к вопросам
Junior — Middle
53

Можно ли напрямую выполнять SQL-запросы в Django без использования ORM?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Да, в Django можно выполнять SQL напрямую, минуя ORM. Для этого обычно используют connection.cursor() или метод raw() у модели. Это полезно, когда нужен сложный запрос, оптимизация или специфичная SQL-функциональность базы данных.

Определение:

Django не ограничивает работу только ORM: при необходимости можно писать и выполнять сырой SQL. Это позволяет обратиться напрямую к базе через курсор или получить объекты модели из raw()-запроса. Такой подход используют, когда ORM неудобен, недостаточно гибок или запрос должен быть максимально точным и производительным.

Пример использования:

from django.db import connection

def get_active_users():
    with connection.cursor() as cursor:
        cursor.execute("SELECT id, username FROM auth_user WHERE is_active = %s", [True])
        rows = cursor.fetchall()
    return rows

Пояснение кода:

Код показывает прямое выполнение SQL без ORM.
connection.cursor() открывает курсор для работы с базой.
cursor.execute() выполняет параметризованный SQL-запрос, где значение True передаётся отдельно, чтобы избежать SQL-инъекций.
fetchall() возвращает все строки результата, которые затем можно обработать в Python.

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

  • Django поддерживает сырой SQL, если ORM не подходит.
  • Для запросов обычно используют connection.cursor(); для выборки объектов модели — raw().
  • Параметры нужно передавать отдельно, а не собирать SQL-строку вручную, чтобы избежать SQL-инъекций.
  • Сырой SQL даёт больше контроля, но снижает переносимость и удобство сопровождения.
  • ORM предпочтительнее в большинстве случаев; raw SQL — это точечный инструмент для сложных или критичных по производительности запросов.