Existe-t-il un moyen de montrer le SQL que Django exécute lors de l'exécution d'une requête?
308
Voir la FAQ de la documentation: " Comment puis-je voir les requêtes SQL brutes exécutées par Django? "
django.db.connection.queries
contient une liste des requêtes SQL:
from django.db import connection
print(connection.queries)
Les ensembles de requêtes ont également un query
attribut contenant la requête à exécuter:
print(MyModel.objects.filter(name="my name").query)
Notez que la sortie de la requête n'est pas un SQL valide, car:
"Django n'interpole jamais réellement les paramètres: il envoie la requête et les paramètres séparément à l'adaptateur de base de données, qui effectue les opérations appropriées."
D'après le rapport de bogue de Django # 17741 .
Pour cette raison, vous ne devez pas envoyer de sortie de requête directement à une base de données.
str()
fonction Pythonian intégrée spécifiée , qui appelle la__str__()
méthode interne . par exemple,str(MyModel.objects.filter(name="my name").query)
je recommanderais également d'utiliser IPython et le shell Django de votre projet. L'achèvement des tabulations permet ensuite l'introspection des objets. Comme Django est connu pour ses schémas de nommage assertifs, cette méthodologie a tendance à être très utile.query
SQL n'est pas valide, car "Django n'interpole jamais réellement les paramètres: il envoie la requête et les paramètres séparément à l'adaptateur de base de données, qui effectue les opérations appropriées." Source: code.djangoproject.com/ticket/17741stable
, nondev
, pour créer un lien vers la version actuelle de Django, comme ceci: docs.djangoproject.com/en/stable/faq/models/…Les extensions Django ont une commande shell_plus avec un paramètre
print-sql
Dans django-shell, toutes les requêtes exécutées seront imprimées
Ex.:
la source
Jetez un œil à debug_toolbar , il est très utile pour le débogage.
La documentation et la source sont disponibles sur http://django-debug-toolbar.readthedocs.io/ .
la source
la source
m = MyModel.objects.get(...)
suivi parm.query
m
n'est plus un ensemble de requêtes. Utilisezq = MyModel.objects.filter(...)
, alorsq.query
, alorsm = q.get()
.Aucune autre réponse ne couvre cette méthode, donc:
Je trouve que la méthode de loin la plus utile, la plus simple et la plus fiable est de demander à votre base de données. Par exemple, sur Linux pour Postgres, vous pourriez faire:
Chaque base de données aura une procédure légèrement différente. Dans les journaux de base de données, vous verrez non seulement le SQL brut, mais toute configuration de connexion ou surcharge de transaction que Django place sur le système.
la source
log_statement='all'
danspostgresql.conf
cette méthode.postgresql.conf
en exécutantpsql -U postgres -c 'SHOW config_file'
Bien que vous puissiez le faire avec le code fourni, je trouve que l'utilisation de l'application de barre d'outils de débogage est un excellent outil pour afficher les requêtes. Vous pouvez le télécharger depuis github ici .
Cela vous donne la possibilité d'afficher toutes les requêtes exécutées sur une page donnée ainsi que le temps nécessaire à la requête. Il résume également le nombre de requêtes sur une page ainsi que le temps total pour un examen rapide. C'est un excellent outil, lorsque vous voulez voir ce que fait Django ORM dans les coulisses. Il possède également de nombreuses autres fonctionnalités intéressantes que vous pouvez utiliser si vous le souhaitez.
la source
Une autre option, voir les options de journalisation dans settings.py décrites par cet article
http://dabapps.com/blog/logging-sql-queries-django-13/
debug_toolbar ralentit chaque chargement de page sur votre serveur de développement, la journalisation ne l'est pas donc c'est plus rapide. Les sorties peuvent être sauvegardées sur console ou fichier, donc l'interface utilisateur n'est pas aussi agréable. Mais pour les vues avec beaucoup de SQL, le débogage et l'optimisation des SQL peuvent prendre du temps via debug_toolbar, car chaque chargement de page est si lent.
la source
Si vous vous assurez que votre fichier settings.py a:
django.core.context_processors.debug
répertorié dansCONTEXT_PROCESSORS
DEBUG=True
IP
dans leINTERNAL_IPS
tupleEnsuite, vous devriez avoir accès à la
sql_queries
variable. J'ajoute un pied de page à chaque page qui ressemble à ceci:J'ai obtenu la variable
sql_time_sum
en ajoutant la ligneà la fonction de débogage dans django_src / django / core / context_processors.py.
la source
J'ai développé une extension à cet effet, afin que vous puissiez facilement mettre un décorateur sur votre fonction d'affichage et voir combien de requêtes sont exécutées.
À installer:
Pour utiliser comme gestionnaire de contexte:
Pour utiliser comme décorateur:
Github: https://github.com/rabbit-aaron/django-print-sql
la source
Je pense que cela devrait fonctionner si vous utilisez PostgreSQL:
la source
Ce qui suit renvoie la requête en tant que SQL valide, basé sur https://code.djangoproject.com/ticket/17741 :
la source
J'ai créé un petit extrait que vous pouvez utiliser:
Il prend comme fonction paramètres (contient des requêtes SQL) pour inspecter et args, les kwargs nécessaires pour appeler cette fonction. En conséquence, il renvoie la fonction renvoyée et imprime les requêtes SQL dans une console.
la source
J'ai mis cette fonction dans un fichier util dans l'une des applications de mon projet:
Ensuite, au besoin, je l'importe et l'appelle à partir de n'importe quel contexte (généralement une vue) nécessaire, par exemple:
C'est agréable de le faire en dehors du modèle, car si vous avez des vues API (généralement Django Rest Framework), cela s'applique également là-bas.
la source
Pour Django 2.2:
Comme la plupart des réponses ne m'ont pas beaucoup aidé lors de l'utilisation
./manage.py shell
. Enfin, j'ai trouvé la réponse. J'espère que cela aide quelqu'un.Pour afficher toutes les requêtes:
Pour afficher une requête pour une seule requête:
q.query
juste afficher l'objet pour moi. L'utilisation de la__str__()
(représentation de chaîne) affiche la requête complète.la source
Afficher les requêtes à l' aide de django.db.connection.queries
Accéder à une requête SQL brute sur un objet QuerySet
la source
Juste pour ajouter, dans django, si vous avez une requête comme:
faire:
pour obtenir la chaîne sql
la source