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 Debug Toolbar に由来します。

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

settings.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 に答える