Django ORM 쿼리 세트의 해당 SQL 쿼리를 보는 방법은 무엇입니까?


164

Django ORM이 생성하는 쿼리를 인쇄 할 수있는 방법이 있습니까?

다음 문장을 실행한다고 가정 해보십시오. Model.objects.filter(name='test')

생성 된 SQL 쿼리를 보려면 어떻게합니까?

답변:


178

각 QuerySet 오브젝트에는 query디버깅 목적으로 stdout에 로그하거나 인쇄 할 수 있는 속성이 있습니다.

qs = Model.objects.filter(name='test')
print qs.query

편집하다

또한 이 스 니펫에 설명 된대로 사용자 지정 템플릿 태그를 사용 하여 단일 요청 범위에 쿼리를 HTML 주석으로 삽입했습니다.


6
.save ()에 대한 쿼리는 어떻습니까?
DataGreed

@DataGreed 좋은 질문입니다. 더 많은 응답을 얻을 수 있도록 새 스레드를 요청하는 것이 좋습니다.
Joe Holloway

4
함께 작동 하는가 prefetch_related즉,이 쿼리를 보여?
사용자

작동하지 않습니다. 난 참조<django.db.models.sql.query.Query object
dopatraman

print (str (qs.query))를 시도하십시오. 나는 그들이 10 년 만에 내부를 조금 바꾸 었다고 생각합니다
Joe Holloway

114

파이썬 로깅을 사용하여 Django에서 생성 된 모든 쿼리를 기록 할 수도 있습니다. 이것을 설정 파일에 추가하십시오.

LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # django also has database level logging
        },
    },
}

응용 프로그램이 html 출력을 생성하는 경우 다른 방법 -django 디버그 도구 모음을 사용할 수 있습니다.


3
누군가가하고 싶은 경우 sumup로 요약실행되는 쿼리의 수 뿐만 아니라 전체 시간 이 걸렸다 : dabapps.com/blog/logging-sql-queries-django-13
andilabs

9
그것은 나를 위해 작동하지 않았다, 나는 'level': 'DEBUG'아래 에 추가해야 했다 'django.db'.
rvernica

108

이 코드를 쉘에 붙여 넣으면 모든 SQL 쿼리가 표시됩니다.

# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())


30

django-debug-toolbar응용 프로그램을 살펴보면 모든 쿼리를 기록하고 프로파일 링 정보 등을 표시합니다.


3
이것은 매우 유용하지만 GUI에서만 작동하며 ORM에서 직접 쿼리 로그를 보려는 경우가 있습니다. 예를 들어 GUI가없는 api가 있습니다!
wim

3

강력한 솔루션은 데이터베이스 서버가 파일에 로그 한 다음

tail -f /path/to/the/log/file.log

2

데이터베이스 라우팅을 사용하는 경우 둘 이상의 데이터베이스 연결이있을 수 있습니다. 이와 같은 코드를 사용하면 세션에서 연결을 볼 수 있습니다. 단일 연결에서와 같은 방법으로 통계를 재설정 할 수 있습니다.reset_queries()

from django.db import connections,connection,reset_queries
...
reset_queries()  # resets data collection, call whenever it makes sense

...

def query_all():
    for c in connections.all():
        print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")

# and if you just want to count the number of queries
def query_count_all()->int:
    return sum(len(c.queries) for c in connections.all() )

1

Django debug_toolbar를 사용하여 SQL 쿼리를 볼 수 있습니다. debug_toolbar 사용법에 대한 단계별 안내서 :

Debug_toolbar를 설치하십시오

pip install django-debug-toolbar

settings.py 파일을 편집하고 설치된 앱에 debug_toolbar를 추가하십시오. 아래에 'django.contrib.staticfiles'에 추가해야합니다. 또한 미들웨어에 debug_toolbar를 추가하십시오.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

settings.py 파일에 INTERNAL_IPS라는 새 목록을 만듭니다.

Settings.py => settings.py 파일의 끝에 새 목록을 만들고 아래 목록을 추가하십시오.

INTERNAL_IPS= [127.0.0.1']

이를 통해 디버그는 내부 개발 서버에서만 실행될 수 있습니다.

#Project의 urls.py 파일을 편집하고 아래 코드를 추가하십시오.

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

마이그레이션 적용 및 서버 다시 실행

127.0.0.1의 웹 페이지에 애드온이 표시되며 SQL 쿼리 확인란을 클릭하면 실제로 쿼리 실행 시간도 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.