59 votes

Django : montrer/log les appels sql de l'ORM depuis le shell python

En utilisant l'excellent Django-Devserver Je trouve toutes sortes d'appels SQL intéressants et inattendus dans mon code. Je voulais savoir d'où venaient ces appels, et je cherche donc un moyen d'obtenir un journal ou une impression de tous les appels SQL générés par l'ORM de Django dans le shell Python. En d'autres termes, lorsque je fais un appel à l'ORM de Django via le shell Python, j'aimerais voir le SQL résultant imprimé ou enregistré.

J'ai remarqué plusieurs solutions qui ajoutent des informations de journal à la page html. Existe-t-il un moyen simple d'envoyer ces informations à la ligne de commande ?

197voto

jacobian Points 2892

Si vous utilisez Django 1.3 :

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())

0 votes

Que faire si j'utilise django 1.2 ?

0 votes

@jrwren, au moins pour le développement

0 votes

Incroyable ! en ajoutant ce snippet à mon fichier startup.py, je peux effectivement imprimer des informations de débogage SQL à chaque fois que je débogue mon code dans le shell django.

32voto

Daniel Roseman Points 199743

Rob Hudson Barre d'outils de débogage Django en plus de sa génialité générale, comprend également une fonction très astucieuse. debugsqlshell manage.py qui fait exactement cela.

0 votes

Pour savoir d'où viennent les appels et ce qui se passe "en coulisses", je recommande également la barre d'outils de débogage de Django. Non seulement pour la commande debugsqlshell mais aussi pour la barre d'outils elle-même qui contient également de nombreuses informations sur les appels SQL.

12voto

Zach Points 4886

Si vous êtes dans le shell, ou n'importe où d'ailleurs, vous pouvez utiliser la méthode queryset

query.as_sql()

pour imprimer la commande SQL.

ie :

MyModel.objects.all().query.as_sql()

4 votes

Vous pouvez aussi faire >>> print MyModel.objects.all().query

12 votes

En utilisant Django 1.5 et query.as_sql() ne fonctionne pas pour moi. query.sql_with_params() le fait cependant.

7voto

cooncesean Points 385
qs = YourModel.objects.all()

qs.query.get_compiler('default').as_sql()

1 votes

Str(qs) fait aussi bien l'affaire.

5voto

Craig Trader Points 8924

Si vous voulez vraiment voir/enregistrer toutes les requêtes SQL, vous voudrez essayer Django 1.3 (actuellement en alpha, mais bientôt en production) qui permet de Enregistreurs Python pour de nombreux composants, y compris les backends de la base de données.

Bien sûr, si vous êtes coincé en utilisant une version stable de Django, vous pouvez obtenir le même effet relativement facilement en Parcheando. django/db/models/sql/compiler.py en l'ajoutant au bas de la liste des importations :

import logging
_querylogger = logging.getLogger( 'sql.compiler' )

Le trouver le SQLCompiler::execute_sql() méthode et changement :

    cursor = self.connection.cursor()
    cursor.execute( sql, params )

à ça :

    cursor = self.connection.cursor()
    _querylogger.info( "%s <= %s", sql, params )
    cursor.execute( sql, params )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X