2

我扩展了 Django CursorDebugWrapper 执行例程,因此在服务器端我可以跟踪所有执行的 SQL。看起来像这样:

class PrintQueryWrapper(django.db.backends.util.CursorDebugWrapper):
    def execute(self, sql, params=()):
        try:
            return self.cursor.execute(sql, params)
        finally:
            # record sql and do other stuff

django.db.backends.util.CursorDebugWrapper = PrintQueryWrapper

问题是我需要每个用户会话单独执行此操作,否则它将记录所有用户的所有 sql,而不知道来自哪里的内容。如果我可以从 execute() 访问用户 ID,我可以轻松跟踪每个用户的 SQL,但如果无法访问请求对象,我不知道如何做到这一点。

注意:我不能为上述代码申请信用。它起源于 Django 调试工具栏。

4

1 回答 1

1

您可以使用中间件:

中间件.py:

import django.db.backends.util


class PrintQueryWrapper(django.db.backends.util.CursorDebugWrapper):
    user_id = None
    def execute(self, sql, params=()):
        try:
            return self.cursor.execute(sql, params)
        finally:
            print self.user_id, ": ", sql   

class PrintQueryMiddleware(object):
    def process_request(self, request): 
        PrintQueryWrapper.user_id = request.user.pk
        django.db.backends.util.CursorDebugWrapper = PrintQueryWrapper

设置.py:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'main.middleware.PrintQueryMiddleware',         # chnage path to your app
)
于 2013-02-06T15:31:27.957 回答