Полное руководство по использованию Raw SQL в Django ORM

Django ORM (объектно-реляционное сопоставление) предоставляет высокоуровневую абстракцию для взаимодействия с базами данных в Django. Хотя Django ORM предлагает мощный набор инструментов запросов, существуют сценарии, в которых использование чистого SQL может быть полезным. В этой статье мы рассмотрим различные методы использования чистого SQL в Django ORM и предоставим примеры кода для каждого подхода.

Методы использования необработанного SQL в Django ORM:

  1. Метод raw():
    Метод raw()позволяет выполнять необработанные SQL-запросы и получать результаты в виде экземпляров модели. Вот пример:
from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
# Raw SQL query
query = "SELECT * FROM app_book WHERE author = 'John Doe';"
# Using raw() method
books = Book.objects.raw(query)
# Accessing the results
for book in books:
    print(book.title)
    Метод

  1. execute():
    Метод execute()полезен, когда вы не планируете получать экземпляры модели. Он выполняет необработанный SQL-запрос без сопоставления результатов с объектами модели. Вот пример:
from django.db import connection
# Raw SQL query
query = "UPDATE app_book SET author = 'Jane Smith' WHERE id = 1;"
# Using execute() method
with connection.cursor() as cursor:
    cursor.execute(query)
  1. Использование Manager.raw():
    Вы также можете выполнять необработанные SQL-запросы с помощью специального менеджера. Вот пример:
from django.db import models
class BookManager(models.Manager):
    def filter_by_author(self, author_name):
        query = f"SELECT * FROM app_book WHERE author = '{author_name}';"
        return self.raw(query)
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    objects = BookManager()
# Querying using custom manager
books = Book.objects.filter_by_author('John Doe')
# Accessing the results
for book in books:
    print(book.title)
  1. Непосредственное использование объекта подключения:
    Вы также можете напрямую использовать объект подключения для выполнения необработанных SQL-запросов. Вот пример:
from django.db import connection
# Raw SQL query
query = "SELECT * FROM app_book WHERE author = 'John Doe';"
# Using connection object
with connection.cursor() as cursor:
    cursor.execute(query)
    results = cursor.fetchall()
# Accessing the results
for row in results:
    print(row[0])

Используя чистый SQL в Django ORM, вы можете обрабатывать сложные сценарии и при необходимости оптимизировать производительность. Однако важно разумно использовать чистый SQL, поскольку он обходит некоторые встроенные средства защиты Django. Понимание этих методов позволит вам эффективно использовать чистый SQL в ваших проектах Django.