54 votes

django orm, comment visualiser (ou enregistrer) la requête exécutée ?

Existe-t-il un moyen d'imprimer la requête générée par l'ORM de Django ?

Disons que j'exécute l'instruction suivante : Model.objects.filter(name='test')

Comment puis-je voir la requête SQL générée ?

Merci d'avance !

61voto

Joe Holloway Points 11122

Chaque objet QuerySet possède un champ "query" que vous pouvez enregistrer ou imprimer sur stdout à des fins de débogage.

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

Modifier

J'ai également utilisé des balises de modèle personnalisées (comme indiqué dans le document intitulé cet extrait ) pour injecter les requêtes dans la portée d'une seule requête sous forme de commentaires HTML.

46voto

aisbaa Points 1202

Vous pouvez également utiliser la journalisation python pour enregistrer toutes les requêtes générées par Django. Il suffit de l'ajouter à votre fichier de configuration.

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
        },
    },
}

33voto

Daniel Roseman Points 199743

Mientras DEBUG est en cours :

from django.db import connection
print connection.queries

Pour une requête individuelle, vous pouvez le faire :

Model.objects.filter(name='test').query.as_sql()

17voto

Mikhail Korobov Points 6225

Peut-être que vous devriez jeter un coup d'oeil à django-debug-toolbar il enregistrera toutes les requêtes pour vous, affichera des informations de profilage pour celles-ci et bien plus encore.

14voto

Pramod Points 1615

Vous pouvez coller ce code sur votre interpréteur qui affichera toutes les requêtes 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())

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X