web-dev-qa-db-fra.com

Comment afficher la requête SQL correspondante du groupe de requêtes de ORM Django?

Est-il possible d'imprimer la requête générée par l'ORM 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?

147
DjangoNewbe

Chaque objet QuerySet a un attribut 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 cet extrait ) pour injecter les requêtes dans le champ d'application d'une requête unique sous forme de commentaires HTML.

160
Joe Holloway

Vous pouvez également utiliser python logging pour consigner toutes les requêtes générées par Django. Ajoutez simplement ceci à votre fichier de paramètres.

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

Une autre méthode dans le cas où l’application génère une sortie html - barre d’outils de débogage de Django peut être utilisée.

111
aisbaa

Vous pouvez coller ce code sur votre interprète 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())
101
Pramod

Tant que DEBUG est activé:

from Django.db import connection
print(connection.queries)

Pour une requête individuelle, vous pouvez faire:

print(Model.objects.filter(name='test').query)
68
Daniel Roseman

Peut-être devriez-vous jeter un oeil à Django-debug-toolbar application, il enregistre toutes les requêtes pour vous, affiche les informations de profilage pour elles et bien plus encore.

29
Mikhail Korobov

Une solution efficace consisterait à consigner votre serveur de base de données dans un fichier, puis

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

Vous pouvez utiliser un Django debug_toolbar pour afficher la requête SQL. Guide étape par étape pour l'utilisation de debug_toolbar:

Installer la barre d'outils Debug_tool

pip install Django-debug-toolbar

Modifiez le fichier settings.py et ajoutez debug_toolbar aux applications installées. Ajoutez-le ci-dessous à "Django.contrib.staticfiles". Ajoutez également debug_toolbar à Middleware.

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

créer une nouvelle liste nommée INTERNAL_IPS dans le fichier settings.py

Settings.py => créez une nouvelle liste à la fin du fichier settings.py et ajoutez la liste ci-dessous:

INTERNAL_IPS= [127.0.0.1']

Cela permettra au débogage de s’exécuter uniquement sur le serveur de développement interne

Editez le fichier urls.py de #Project et ajoutez le code ci-dessous:

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

appliquer migrate & run server again

Vous verrez un complément sur votre page Web à l'adresse 127.0.0.1 & si vous cochez la case Requête SQL, vous pouvez également voir le temps d'exécution de la requête.

1
Devesh G