쿼리를 수행하는 동안 Django가 실행중인 SQL을 표시하는 방법이 있습니까?
답변
docs FAQ : ” Django가 실행중인 원시 SQL 쿼리를 어떻게 확인할 수 있습니까? “를 참조하십시오.
django.db.connection.queries
SQL 쿼리 목록을 포함합니다.
from django.db import connection
print(connection.queries)
또한 쿼리 셋에는 실행할 쿼리가 포함 된 query
속성 이 있습니다.
print(MyModel.objects.filter(name="my name").query)
다음과 같은 이유로 쿼리 출력이 유효한 SQL이 아닙니다.
“Django는 실제로 매개 변수를 보간하지 않습니다. 쿼리와 매개 변수를 개별적으로 데이터베이스 어댑터로 보내 적절한 작업을 수행합니다.”
장고 버그 보고서 # 17741에서 .
따라서 쿼리 출력을 데이터베이스로 직접 보내면 안됩니다.
답변
장고 확장 에는 매개 변수 가있는 shell_plus 명령이 있습니다.print-sql
./manage.py shell_plus --print-sql
장고 셸에서 실행 된 모든 쿼리가 인쇄됩니다.
전의.:
User.objects.get(pk=1)
SELECT "auth_user"."id",
"auth_user"."password",
"auth_user"."last_login",
"auth_user"."is_superuser",
"auth_user"."username",
"auth_user"."first_name",
"auth_user"."last_name",
"auth_user"."email",
"auth_user"."is_staff",
"auth_user"."is_active",
"auth_user"."date_joined"
FROM "auth_user"
WHERE "auth_user"."id" = 1
Execution time: 0.002466s [Database: default]
<User: username>
답변
debug_toolbar를 살펴보면 디버깅에 매우 유용합니다.
설명서 및 소스는 http://django-debug-toolbar.readthedocs.io/ 에서 볼 수 있습니다 .
답변
q = Query.objects.values('val1','val2','val_etc')
print q.query
답변
다른 방법으로는이 방법을 다루지 않으므로 다음을 수행하십시오.
가장 유용하고 간단하며 신뢰할 수있는 방법은 데이터베이스를 요청하는 것입니다. 예를 들어 Linux for Postgres에서 다음을 수행 할 수 있습니다.
sudo su postgres
tail -f /var/log/postgresql/postgresql-8.4-main.log
각 데이터베이스마다 절차가 약간 다릅니다. 데이터베이스 로그에는 원시 SQL뿐만 아니라 모든 연결 설정 또는 트랜잭션 오버 헤드 django가 시스템에 있습니다.
답변
제공된 코드를 사용하여 수행 할 수 있지만 디버그 도구 모음 앱을 사용하는 것이 쿼리를 표시하는 훌륭한 도구라는 것을 알았습니다. 여기 에서 github 에서 다운로드 할 수 있습니다 .
이를 통해 주어진 페이지에서 실행 된 모든 쿼리를 쿼리 시간과 함께 표시 할 수 있습니다. 또한 빠른 검토를 위해 페이지의 쿼리 수와 총 시간을 합산합니다. Django ORM이 무대 뒤에서 무엇을하는지보고 싶을 때 훌륭한 도구입니다. 그것은 또한 당신이 원한다면 사용할 수있는 다른 좋은 기능이 많이 있습니다.
답변
다른 옵션은 settings.py의 로깅 옵션을 참조하십시오.
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar는 개발자 서버의 각 페이지로드 속도를 늦추므로 로깅 속도가 빠르지 않습니다. 출력은 콘솔이나 파일로 덤프 될 수 있으므로 UI가 좋지 않습니다. 그러나 SQL이 많은 뷰의 경우 각 페이지로드가 너무 느리기 때문에 debug_toolbar를 통해 SQL을 디버깅하고 최적화하는 데 시간이 오래 걸릴 수 있습니다.
