Можно ли напрямую выполнять 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 — это точечный инструмент для сложных или критичных по производительности запросов.