Блог

Python/Django: выполнить запрос

Сделал себе заметку как в Django можно выполнить SQL запрос.

Вариант 1:

>>> Person.objects.raw('SELECT id, first_name, last_name, birth_date FROM myapp_person')

Этот пример принимает SQL запрос, выполняет его и возвращает RawQuerySet инстанции.
Кроме того, можно сопоставить поля в запросе на модель поля. Это словарь отображение имен полей в запросе на имена полей от модели.

>>> name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
>>> Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)

Если вам нужно выполнять параметризованные запросы, вы можете использовать аргументы:

>>> lname = 'Doe'  
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])

Вариант 2:

Выполнение пользовательских SQL запросов:

>>> from django.db import connection, transaction>>> cursor = connection.cursor() 
>>> 
>>> # Data modifying operation - commit required 
>>> cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [baz])
>>> transaction.commit_unless_managed() 
>>> 
>>> # Data retrieval operation - no commit required 
>>> cursor.execute("SELECT foo FROM bar WHERE baz = %s", [baz]) 
>>> row = cursor.fetchone() 
>>> row

Для чего нужен transaction.commit_unless_managed(), после выполнения операций изменения, должны вызвать .commit_unless_managed(), чтобы обеспечить изменения, будут фиксироваться в базе данных. Если Ваш запрос носит чисто операции извлечения данных, фиксация не требуется.

https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly