registra tutte le query sql


98

Come posso registrare tutte le query SQL eseguite dalla mia applicazione django?

Voglio registrare tutto, inclusi gli SQL dal sito di amministrazione. Ho visto questa domanda e una risposta alle domande frequenti, ma non riesco ancora a capire dove devo metterle

from django.db import connection
connection.queries

registrare tutto in un file?

Quindi la mia domanda è: cosa devo fare per avere un file (ad esempio all-sql.log) in cui vengono registrate tutte le istruzioni SQL?


Risposte:


19

Forse controlla https://github.com/django-debug-toolbar/django-debug-toolbar

Ti consentirà di vedere tutte le query generate da una determinata pagina. Così come le tracce dello stack di dove si verificano ecc.

MODIFICA: per registrare tutte le query SQL in un file, ecc., Dovrai creare un middleware. Il middleware viene eseguito su ogni richiesta. Ci sono diversi frammenti di Django là fuori per questo genere di cose:

Quelli si occupano della stampa sul terminale, ma non sarebbe difficile adattarli per utilizzare la libreria di registrazione di python.


177

Unisci il seguente snippet con il LOGGINGcampo nel tuo 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'],
        }
    }
}

Ottimizzato dalla risposta di @ acardenas89


3
potresti dover aggiungere quanto segue alla handlerssezione nel caso in cui non sia possibile aggiungere il gestore "console": errore "console" : 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
Don Grem

1
Avevo bisogno anche 'version': 1,nel LOGGINGdict.
Dan

12
Tieni presente che DEBUG deve essere TRUE affinché i log vengano effettivamente registrati. Indipendentemente dalle impostazioni di registrazione.
Janusz Skonieczny

3
Oh, e un'altra cosa al Django test runner ignora le impostazioni e le sostituzioni DEBUGa False, quindi in prova è necessario@override_settings(DEBUG=True)
Janusz Skonieczny

7
Vorrei anche aggiungere 'propagate': Falsedopo la 'handlers': ['console'],riga, nel caso in cui tu abbia un logger di root abilitato e non sai perché viene stampato due volte. Mi ci è voluto un po 'per rendermene conto.
Andrei-Niculae Petre

44

Aggiungi le seguenti dichiarazioni in grassetto in settings.py


se DEBUG:
    registrazione delle importazioni
    l = logging.getLogger ('django.db.backends')
    l.setLevel (logging.DEBUG)
    l.addHandler (logging.StreamHandler ())


LOGGING = {
    'versione': 1,
    'disable_existing_loggers': False,
    "filtri": {
        "require_debug_false": {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    "gestori": {
        "mail_admins": {
            'level': 'ERROR',
            "filtri": ["require_debug_false"],
            "class": "django.utils.log.AdminEmailHandler"
        }, "console": {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        } ,
    },
    "logger": {
        "django.request": {
            "gestori": ["mail_admins"],
            'level': 'ERROR',
            'propagate': vero,
        }, "django.db.backends.sqlite3": {
            'level': 'DEBUG',
            "gestori": ["console"],
        } ,
    }
}
  

Risorsa / Credito


9
Non hai bisogno sia della ifdichiarazione in alto che delle LOGGINGmodifiche. L' ifistruzione è per se si desidera aggiungere la registrazione mentre ad esempio nella shell, per attivarla immediatamente - tutto ciò di cui hai bisogno in settings.py sono le LOGGINGmodifiche - e potresti benissimo volere django.db.backends, non quella specifica di sqlite3.
M Somerville

Non vedo alcuna query sulla console che esegue django 1.9. DEBUG = True.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Questo è un commento molto vecchio, molto probabilmente Django 1.9 non supporta questa soluzione allo stesso modo.
cevaris

In Django 1.9, l' DEBUGimpostazione è forzata a essere False durante l'esecuzione dei test. Una soluzione alternativa è riattivarlo nel test
Mouscellaneous


7

Per registrare le query SQL durante il test, sono necessarie due cose:

  1. django.db.backends logger abilitato e
  2. @override_settings(DEBUG=True) decoratore.

Il test runner imposterà DEBUG = False per impostazione predefinita, ignorando ciò che potresti aver impostato in DJANGO_SETTINGS_MODULE.

Le impostazioni minime:

# 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'],
    }
}

Il caso di test di esempio:

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

Hai solo bisogno di:

@override_settings(DEBUG=True)

se hai già le istruzioni di debug SQL stampate runserver.

Aggiungi il decoratore al tuo class TestA(TestCase)o test_function:

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

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

Crediti alla risposta di @Janusz Skonieczny!


0

È necessario inserirlo in un pacchetto middleware. Il middleware si trova tra il core del server web / django e tutte le tue visualizzazioni. Può eseguire la pre-elaborazione prima della richiesta e la post-elaborazione dopo il completamento della richiesta. Ad esempio, salva le query in un file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.