Comment afficher la requête SQL correspondante de queryset de Django ORM?
-
13-09-2019 - |
Question
Est-il possible que je peux imprimer la requête Django ORM génère?
Disons que j'exécutez l'instruction suivante: Model.objects.filter(name='test')
Comment puis-je obtenir pour voir le produit requête SQL?
La solution
Chaque objet QuerySet a un attribut query
que vous pouvez vous connecter ou imprimer à stdout des fins de débogage.
qs = Model.objects.filter(name='test')
print qs.query
Modifier
J'ai aussi utilisé les balises de modèle personnalisés (comme indiqué dans cet extrait ) pour injecter les requêtes dans le cadre d'une seule demande sous forme de commentaires HTML.
Autres conseils
Vous pouvez également utiliser la journalisation python pour enregistrer toutes les requêtes générées par Django. Il suffit d'ajouter 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 la demande de cas génère une impression html - barre de débogage django peut être utilisé.
Vous pouvez coller ce code sur votre interprète qui affiche 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())
Tant que DEBUG
est:
from django.db import connection
print(connection.queries)
Pour une requête individuelle, vous pouvez faire:
print(Model.objects.filter(name='test').query)
Peut-être que vous devriez jeter un oeil à l'application django-debug-toolbar
, il se connectera pour vous toutes les requêtes, les informations de profilage d'affichage pour eux et bien plus encore.
Une solution robuste serait d'avoir votre journal du serveur de base de données dans un fichier, puis sur
tail -f /path/to/the/log/file.log
Vous pouvez utiliser un Django debug_toolbar pour afficher la requête SQL. Guide étape par étape pour l'utilisation du debug_toolbar:
Installer le Debug_toolbar
pip install django-debug-toolbar
Modifier fichier settings.py et ajouter debug_toolbar aux applications installées, cela devrait être ajouté ci-dessous pour « django.contrib.staticfiles ». Ajoutez également debug_toolbar Middleware.
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
créer une nouvelle liste INTERNAL_IPS nommés dans le fichier settings.py
Settings.py => Créer une nouvelle liste à la fin du fichier settings.py et ajouter ci-dessous la liste:
INTERNAL_IPS= [127.0.0.1']
Cela permettra à la mise au point de fonctionner uniquement sur le serveur interne Developement
Modifier fichier urls.py de #Project et ajouter ci-dessous le code:
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
appliquent Migrate et serveur exécuter à nouveau
Vous verrez un add-on sur votre page Web à l'adresse 127.0.0.1 et si vous cliquez sur la case à cocher requête SQL, vous pouvez réellement voir le moment de l'exécution de la requête ainsi.