如何在Django中记录所有SQL查询?

153 投票
10 回答
124139 浏览
提问于 2025-04-16 08:10

我该怎么做才能记录下我这个Django应用程序执行的所有SQL查询呢?

我想记录所有内容,包括来自管理后台的SQL。我看到过这个问题这个常见问题的回答,但我还是搞不清楚应该把

from django.db import connection
connection.queries

放在哪里才能把所有内容记录到一个文件里呢?

所以我的问题是——我该怎么做才能有一个文件(比如叫all-sql.log),把所有的SQL语句都记录在里面?

10 个回答

58

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

资源/来源

255

把下面的代码片段和你在 settings.py 文件里的 LOGGING 字段合并在一起:

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 的回答稍微修改过来的

23

你可以看看这个链接:https://github.com/django-debug-toolbar/django-debug-toolbar

这个工具可以让你看到某个页面生成的所有数据库查询,还能显示这些查询发生的具体位置等信息。

补充一下:如果你想把所有的SQL查询记录到一个文件里,你需要创建一些中间件。中间件会在每次请求时运行。网上有很多关于这个的Django代码片段:

这些代码片段主要是用来在终端打印信息,但你可以很容易地修改它们,使用Python的日志库来记录信息。

撰写回答