Comment puis-je enregistrer toutes les requêtes SQL effectuées par mon application django?
Je veux tout consigner, y compris les SQL du site d'administration. J'ai vu cette question et une réponse à la FAQ, mais je ne sais toujours pas où dois-je mettre
from django.db import connection
connection.queries
tout consigner dans un seul fichier?
Ma question est donc: que dois-je faire pour avoir un fichier (disons all-sql.log) où toutes les instructions SQL sont enregistrées?
Réponses:
Consultez peut-être https://github.com/django-debug-toolbar/django-debug-toolbar
Cela vous permettra de voir toutes les requêtes générées par une page donnée. Ainsi que les traces de leur emplacement, etc.
EDIT: pour enregistrer toutes les requêtes SQL dans un fichier, etc., vous voudrez alors créer un middleware. L'intergiciel s'exécute à chaque demande. Il existe plusieurs extraits Django pour ce genre de chose:
Ceux-ci concernent l'impression sur le terminal, mais il ne serait pas difficile de les adapter pour utiliser la bibliothèque de journalisation de python.
la source
Fusionner l'extrait de code suivant avec le
LOGGING
champ dans votresettings.py
:LOGGING = { 'version': 1, 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', } }, 'handlers': { 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], 'class': 'logging.StreamHandler', } }, 'loggers': { 'django.db.backends': { 'level': 'DEBUG', 'handlers': ['console'], } } }
Modification de la réponse @ acardenas89
la source
handlers
section au cas où vous obtenez Impossible d'ajouter le gestionnaire 'console': erreur 'console' :'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', 'formatter': 'verbose', 'stream': sys.stderr, },
'version': 1,
dans leLOGGING
dict.DEBUG
àFalse
, donc dans le test , vous devez@override_settings(DEBUG=True)
'propagate': False
après la'handlers': ['console'],
ligne, au cas où vous auriez un enregistreur de racine activé et que vous ne sauriez pas pourquoi cela s'imprime deux fois. Il m'a fallu un peu de temps pour réaliser.Ajoutez les instructions en gras suivantes dans settings.py
Ressource / crédit
la source
if
déclaration en haut et desLOGGING
modifications. Laif
déclaration est pour si vous voulez ajouter la journalisation pendant que, par exemple, dans le shell, pour l'activer immédiatement - tout ce dont vous avez besoin dans settings.py, ce sont lesLOGGING
modifications - et vous voudrez peut-êtredjango.db.backends
, pas celle spécifique à sqlite3.DEBUG = True
.DEBUG
paramètre est forcé à être False lors de l'exécution des tests. Une solution de contournement consiste à le réactiver dans le testDjango 1.3 enregistre toutes les instructions SQL dans le journal django.db.backends :
https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends
la source
Pour consigner les requêtes SQL pendant les tests, vous avez besoin de deux choses:
django.db.backends
enregistreur activé et@override_settings(DEBUG=True)
décorateur.Le testeur définira DEBUG = False par défaut, en ignorant ce que vous avez peut-être défini dans DJANGO_SETTINGS_MODULE.
Les paramètres minimum:
# https://docs.djangoproject.com/en/dev/ref/settings/#logging LOGGING = { 'version': 1, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'level': 'DEBUG', }, }, 'root': { 'handlers': ['console'], } }
L'exemple de cas de test:
from django.contrib.auth.models import User from django.test import TestCase, override_settings class UserTests(TestCase): # To log queries in tests you need to manually override DEBUG setting # because testing sets DEBUG=False by default @override_settings(DEBUG=True) def test_create_user(self): User.objects.create()
la source
Tu a juste besoins:
@override_settings(DEBUG=True)
si vous avez déjà des instructions de débogage SQL en cours d'impression
runserver
.Ajoutez le décorateur à votre
class TestA(TestCase)
outest_function
:@override_settings(DEBUG=True) class TestA(TestCase): ... @override_settings(DEBUG=True) def test_function(self): ...
Crédits à la réponse de @Janusz Skonieczny!
la source
Vous devez mettre cela dans un package middleware. Le middleware se situe entre le noyau du serveur web / django et toutes vos vues. Il peut effectuer un prétraitement avant la demande et un post-traitement une fois la demande terminée. Par exemple, enregistrez les requêtes dans un fichier.
la source