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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top