记录所有sql查询

Ole*_*liv 77 django

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

我想记录所有内容,包括来自管理站点的SQL.我看到了这个问题常见问题解答,但我仍然无法弄清楚应该放在哪里

from django.db import connection
connection.queries
Run Code Online (Sandbox Code Playgroud)

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

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

Gia*_*rdi 142

将以下代码段与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'],
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从@ acardenas89回答调整

  • 请注意[DEBUG必须为TRUE](https://docs.djangoproject.com/en/1.11/topics/logging/#django-db-backends)才能实际记录日志.无论记录设置如何. (8认同)
  • 我还要在''处理程序'之后添加''propagate':False`:['console'],`line,以防你启用了根记录器并且不知道为什么会打印两次.我有点意识到了. (5认同)
  • 这在某种程度上是愚蠢和有趣的,当我搜索这个问题时,找到我自己的答案.几个月后我怎么能不记得这个? (3认同)
  • 哦,还有一件事在django测试运行器中忽略设置并覆盖`DEBUG`为'False`,因此在测试中你必须`@override_settings(DEBUG = True) (3认同)
  • 如果你得到_Unable来添加处理程序'console',你可能需要将以下内容添加到`handlers`部分:'console'_ error:`'console':{'level':'DEBUG','class':' logging.StreamHandler','formatter':'verbose','stream':sys.stderr,},` (2认同)
  • 我还需要“LOGGING”字典中的“version”: 1,。 (2认同)
  • 为什么运行测试时这不起作用? (2认同)

cev*_*ris 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'],
        },
    }
}
  

资源/信用

  • 您不需要顶部的`if`语句和`LOGGING`更改.`if`语句用于如果你想在shell中添加日志记录,立即打开它 - 你在settings.py中需要的只是`LOGGING`更改 - 你可能想要`django.db.backends `,而不是sqlite3特定的. (9认同)

Joh*_*ery 17

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

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

编辑:要将所有SQL查询记录到文件等,那么您将需要创建一些中间件.中间件可以在每个请求上运行.有几个Django片段用于此类事情:

那些与打印到终端有关,但要使它们适应使用python的日志库并不困难.


Jan*_*zny 12

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

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

默认情况下,测试运行程序将设置 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'],
    }
}
Run Code Online (Sandbox Code Playgroud)

示例测试用例:

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()
Run Code Online (Sandbox Code Playgroud)


Tom*_*ski 11

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

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