[TIL] Django: How to see the raw SQL queries Django is running?

Jene Hojin Choi·2021년 2월 24일
0

Django

목록 보기
9/12
post-thumbnail

아무도 궁금해하지 않을 것 같기도 하지만 나는 신기하기도 했고 재밌어서 올려본다...

Django가 실행하는 실제 SQL query문 확인하는 법

Django라는 프레임워크는 데이터베이스 종류에 구애받지 않고 다양한 타입의 데이터를 객체화하여 모델 매니저를 사용해서 데이터베이스에 쿼리를 해줄 수 있다.

그렇다면 대체 어떤 식으로 내가 실행하고 있는 Django가 어떤 SQL query문을 실행하고 있는지 알 수 있을까?

이것을 확인하면 SQL에 대한 이해도와 Django와 SQL의 연관관계에 대해서 더 잘 이해할 수 있지 않을까 싶었다. 그래서 이 궁금증을 해결하기 위해 (또 다시 구글링 ^^) 찾아보았다.

1. .query

참고: How can I see the raw SQL queries Django is running?

다음과 같은 테이블이 있다고 하자: Django의 models.py에서는 Class Drink에 해당하는 테이블이다.

예제1.

>>> drinks=Drink.objects.all()
>>> print(drinks.query)
SELECT `drinks`.`id`, `drinks`.`name`, `drinks`.`category_id` 
FROM `drinks`

예제2.

>>> drinks_of_category_1=Drink.objects.filter(category_id__gt=1)
>>> print(drinks_of_category_1.query)
SELECT `drinks`.`id`, `drinks`.`name`, `drinks`.`category_id` 
FROM `drinks`
WHERE `drinks`.`category_id` > 1

위와 같이 drinks라는 queryset을 이용하여 .query를 통해 SQL의 query문을 살펴볼 수 있다.
참고로, .query는 queryset에만 쓸 수 있다. object에는 .query를 쓸 수 없다.

2. connection.queries

참고: How can I see the raw SQL queries Django is running?

django.db에서 제공해주는 connection을 통해서 확인할 수도 있다.
한가지 확실히 짚고 넘어가야할 점은, 이것을 쓰기 위해서라면 Django DEBUG 세팅이 True로 되어있어야한다는 점이다.

python manage.py shell
>> from django.db import connection
>> from some_app.models import SomeClass
>> obj = SomeClass.objects.first()
>> connection.queries
>> <지금까지 있었던 쿼리문을  리턴해준다>

예제1.

>>> from products.models import *
>>> drink1=Drink.objects.first()
>>> drink2=Drink.objects.filter(name__icontains='크림')
>>> connection.queries
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
{'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
'time': '0.000'}, {'sql': 'SELECT `drinks`.`id`, `drinks`.`name`, 
`drinks`.`category_id` FROM `drinks` ORDER BY `drinks`.`id` 
ASC LIMIT 1', 'time': '0.001'}]

1개의 댓글

comment-user-thumbnail
2021년 2월 27일

엄청난 꿀팁 ❤️

답글 달기