Réponses:
Chaque objet QuerySet possède un query
attribut que vous pouvez enregistrer ou imprimer sur stdout à des fins de débogage.
qs = Model.objects.filter(name='test')
print qs.query
Éditer
J'ai également utilisé des balises de modèle personnalisées (comme indiqué dans cet extrait de code) pour injecter les requêtes dans le cadre d'une seule demande sous forme de commentaires HTML.
prefetch_related
ie show 2 requêtes? Je ne vois que 1.
<django.db.models.sql.query.Query object
Vous pouvez également utiliser la journalisation python pour journaliser 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 au cas où l'application génère une sortie html - la barre d'outils de débogage django peut être utilisée.
'level': 'DEBUG'
sous 'django.db'
.
Tant qu'il DEBUG
est allumé:
from django.db import connection
print(connection.queries)
Pour une requête individuelle, vous pouvez faire:
print(Model.objects.filter(name='test').query)
query
renvoie un Query
objet depuis Djagno 1.2 qui n'a pas d' as_sql
attribut.
Vous devriez peut-être jeter un œil à l' django-debug-toolbar
application, elle enregistrera toutes les requêtes pour vous, affichera les informations de profilage pour elles et bien plus encore.
Si vous utilisez le routage de base de données, vous disposez probablement de plusieurs connexions à la base de données. Un code comme celui-ci vous permet de voir les connexions dans une session. Vous pouvez réinitialiser les statistiques de la même manière qu'avec une seule connexion:reset_queries()
from django.db import connections,connection,reset_queries
...
reset_queries() # resets data collection, call whenever it makes sense
...
def query_all():
for c in connections.all():
print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")
# and if you just want to count the number of queries
def query_count_all()->int:
return sum(len(c.queries) for c in connections.all() )
Vous pouvez utiliser une debug_toolbar Django 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éer une nouvelle liste à la fin du fichier settings.py et ajouter 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 module complémentaire sur votre page Web à 127.0.0.1 et si vous cliquez sur la case à cocher Requête SQL, vous pouvez également voir le temps d'exécution de la requête.