2014-07-21 71 views
2

我希望在請求期間執行每個查詢的回溯,這樣我就可以找到它們來自哪裏並減少計數/複雜度。Django查詢回溯

我正在使用this優秀的中間件片段來列出和時間查詢,但我不知道它們來自哪裏。

我探討了django/db/models/sql/compiler.py,但顯然獲取django的本地版本並編輯該代碼,我看不到如何鎖定查詢。有沒有我可以使用的信號?它似乎有isn't a signal on every query

是否可以指定默認Manager

(我知道Django的工具欄,我希望有不使用它的解決方案。)

+0

你是什麼意思,他們來自哪裏?請求或代碼庫? –

+0

在代碼中的位置。 – SColvin

回答

3

醜陋但有效的解決方案(例如,它打印在所有查詢的痕跡,只需要一個編輯)被以下內容添加到的settings.py底部:

如果
import django.db.backends.utils as bakutils 
import traceback 

bakutils.CursorDebugWrapper_orig = bakutils.CursorWrapper 

def print_stack_in_project(): 
    stack = traceback.extract_stack() 
    for path, lineno, func, line in stack: 
     if 'lib/python' in path or 'settings.py' in path: 
      continue 
     print 'File "%s", line %d, in %s' % (path, lineno, func) 
     print ' %s' % line 

class CursorDebugWrapperLoud(bakutils.CursorDebugWrapper_orig): 
    def execute(self, sql, params=None): 
     try: 
      return super(CursorDebugWrapperLoud, self).execute(sql, params) 
     finally: 
      print_stack_in_project() 
      print sql 
      print '\n\n\n' 

    def executemany(self, sql, param_list): 
     try: 
      return super(CursorDebugWrapperLoud, self).executemany(sql, param_list) 
     finally: 
      print_stack_in_project() 
      print sql 
      print '\n\n\n' 

bakutils.CursorDebugWrapper = CursorDebugWrapperLoud 

仍不能確定有這樣做的更優雅的方式?

0

Django調試工具欄會告訴你你想要什麼壯觀的精彩。