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?
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.
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.
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())
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)
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.
Une solution efficace consisterait à consigner votre serveur de base de données dans un fichier, puis
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 de debug_toolbar:
pip install Django-debug-toolbar
Settings.py =>
INSTALLED_APPS= [ 'debug_toolbar']
MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']
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
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
url(r'^__debug__/', include(debug_toolbar.urls))
] + urlpatterns
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.