모든 SQL 쿼리 기록


97

내 장고 애플리케이션이 수행 한 모든 SQL 쿼리를 어떻게 기록 할 수 있습니까?

관리 사이트의 SQL을 포함하여 모든 것을 기록하고 싶습니다. 내가 본 이 질문FAQ에 대답을 하지만, 난 여전히 내가 어디에 놓아야 알아낼 수 없습니다

from django.db import connection
connection.queries

모든 것을 하나의 파일에 기록하려면?

그래서 내 질문은-모든 SQL 문이 기록되는 파일 (예 : all-sql.log)을 가지려면 어떻게해야합니까?


답변:


19

https://github.com/django-debug-toolbar/django-debug-toolbar를 확인 하십시오.

주어진 페이지에서 생성 된 모든 쿼리를 볼 수 있습니다. 발생 위치 등의 스택 추적

편집 : 모든 SQL 쿼리를 파일 등에 기록하려면 미들웨어를 만들고 싶을 것입니다. 미들웨어는 모든 요청에서 실행됩니다. 이런 종류의 Django 스 니펫이 여러 개 있습니다.

그들은 터미널에 인쇄하는 것과 관련이 있지만 파이썬의 로깅 라이브러리를 사용하도록 조정하는 것은 어렵지 않습니다.


176

다음 코드 조각을의 LOGGING필드 와 병합 합니다 settings.py.

LOGGING = {
    'version': 1,
    'filters': {
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue',
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
        }
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
            'handlers': ['console'],
        }
    }
}

@ acardenas89 답변에서 조정


3
Unable to add handler 'console': 'console' 오류가 발생하는 handlers경우 섹션에 다음을 추가해야 할 수 있습니다 . 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Don Grem

1
나는 또한 dict 'version': 1,에서 필요 했습니다 LOGGING.
Dan

12
참고하시기 바랍니다 DEBUG는 TRUE해야합니다 실제로 기록에 로그를. 로깅 설정에 관계없이.
Janusz Skonieczny

3
아, 장고 테스트 러너에 한 가지 더 설정 및 재정의를 무시하고 DEBUGFalse그래서 당신이해야 테스트,@override_settings(DEBUG=True)
야누 Skonieczny

6
루트 로거가 활성화되어 있고 이것이 두 번 인쇄되는 이유를 모르는 경우 줄 'propagate': False뒤에 추가 'handlers': ['console'],합니다. 깨닫기 위해 조금 걸렸습니다.
Andrei-Niculae Petre

44

settings.py에 다음 굵은 문장을 추가하십시오.


디버그하는 경우 :
    가져 오기 로깅
    l = logging.getLogger ( 'django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


로깅 = {
    '버전': 1,
    'disable_existing_loggers': False,
    '필터': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            '수준': '오류',
            '필터': [ 'require_debug_false'],
            '클래스': 'django.utils.log.AdminEmailHandler'
        }, '콘솔': {
            '레벨': '디버그',
            '클래스': 'logging.StreamHandler',
        } ,
    },
    '로거': {
        'django.request': {
            'handlers': [ 'mail_admins'],
            '수준': '오류',
            '전파': 참,
        }, 'django.db.backends.sqlite3': {
            '레벨': '디버그',
            '핸들러': [ '콘솔'],
        } ,
    }
}
  

자원 / 신용


9
if상단 의 진술과 LOGGING변경 사항 이 모두 필요하지는 않습니다 . if문을 사용하면 쉘에서 예 동안 로깅을 추가하려는 경우, 즉시 전원을 켜을 위해 - 당신은 settings.py에서 필요로하는 모든이입니다 LOGGING변경 - 당신은 잘 할 수 있습니다 django.db.backends하지 sqlite3를의 특정 하나.
M Somerville 2013 년

django 1.9를 실행하는 콘솔에 어떤 쿼리도 표시되지 않습니다. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 이것은 정말 오래된 주석입니다. Django 1.9는이 솔루션을 똑같이 지원하지 않습니다.
cevaris

Django 1.9에서는 DEBUG테스트를 실행할 때 설정이 강제로 False가됩니다. 해결 방법은 테스트에서 다시 활성화하는 것입니다
Mouscellaneous


7

테스트 중에 SQL 쿼리를 기록하려면 다음 두 가지가 필요합니다.

  1. django.db.backends 로거 활성화 및
  2. @override_settings(DEBUG=True) 데코레이터.

테스트 실행기는 DJANGO_SETTINGS_MODULE에서 설정 한 내용을 무시하고 기본적으로 DEBUG = False 로 설정합니다.

최소 설정 :

# https://docs.djangoproject.com/en/dev/ref/settings/#logging
LOGGING = {
    'version': 1,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ['console'],
    }
}

예제 테스트 케이스 :

from django.contrib.auth.models import User
from django.test import TestCase, override_settings


class UserTests(TestCase):

    # To log queries in tests you need to manually override DEBUG setting
    # because testing sets DEBUG=False by default

    @override_settings(DEBUG=True)
    def test_create_user(self):
        User.objects.create()

2

다음 만 필요합니다.

@override_settings(DEBUG=True)

이미 SQL 디버그 문이 runserver.

class TestA(TestCase)또는에 데코레이터를 추가하십시오 test_function.

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

@Janusz Skonieczny의 답변에 대한 크레딧!


0

이것을 미들웨어 패키지에 넣어야합니다. 미들웨어는 웹 서버 / django 코어와 모든 뷰 사이에 있습니다. 요청 전 전처리, 요청 완료 후 후 처리가 가능합니다. 예를 들어 쿼리를 파일에 저장합니다.

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