记录所有sql查询

时间:2010-12-07 10:45:26

标签: django

如何记录我的django应用程序执行的所有SQL查询?

我想记录所有内容,包括来自管理站点的SQL。我看到this questiona FAQ answer,但我仍然无法弄清楚应该放在哪里

from django.db import connection
connection.queries

将所有内容记录到一个文件中?

所以我的问题是 - 我应该怎么做一个文件(比如all-sql.log)来记录所有SQL语句?

7 个答案:

答案 0 :(得分:124)

将以下代码段与LOGGING中的settings.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'],
        }
    }
}

从@ acardenas89回答调整

答案 1 :(得分:39)

在settings.py

中添加以下粗体语句

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


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        },'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True,
        },'django.db.backends.sqlite3': {
            'level': 'DEBUG',
            'handlers': ['console'],
        },
    }
}
  

Resource/Credit

答案 2 :(得分:17)

也许请查看https://github.com/django-debug-toolbar/django-debug-toolbar

它可以让您查看给定页面生成的所有查询。以及它们出现的堆栈痕迹等。

编辑:要将所有SQL查询记录到文件等,那么您将需要创建一些中间件。中间件可以在每个请求上运行。这方面有几个Django片段:

那些涉及到终端的打印,但要使它们适应使用python的日志库并不困难。

答案 3 :(得分:10)

Django 1.3将所有SQL语句记录到 django.db.backends 记录器:

https://docs.djangoproject.com/en/dev/topics/logging/#django-db-backends

答案 4 :(得分:1)

要在测试期间记录SQL查询,您需要做两件事:

  1. django.db.backends记录器已启用,并且
  2. @override_settings(DEBUG=True)装饰器。

默认情况下,测试运行程序将set DEBUG=False,而忽略您可能在DJANGO_SETTINGS_MODULE中设置的内容。

最低设置:

# 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'],
    }
}

示例测试用例:

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()

答案 5 :(得分:0)

您需要将其放在中间件包中。中间件位于webserver / django核心和所有视图之间。它可以在请求之前进行预处理,并在请求完成后进行后处理。例如,将查询保存到文件中。

答案 6 :(得分:0)

您只需要:

@override_settings(DEBUG=True)

如果您已经在runserver中打印了SQL调试语句。

将装饰器添加到您的class TestA(TestCase)test_function

@override_settings(DEBUG=True)
class TestA(TestCase):
...

    @override_settings(DEBUG=True)
    def test_function(self):
    ...

@Janusz Skonieczny的答案的积分!