手写SQL查询调试中间件:自动捕获N+1与慢查询并告警
构建一个Django中间件,自动检测每个请求的SQL查询次数、重复查询、慢查询,并实时推送告警到开发者钉钉/邮件。 · 难度:入门 · +10XP
手写SQL查询调试中间件:自动捕获N+1与慢查询并告警
django-debug-toolbar很好,但只能本地用。本教程实现一个生产级解决方案:通过重写CursorWrapper,拦截所有execute/executemany,记录耗时、SQL、调用栈。利用滑动窗口算法检测同一SQL在短时间内重复出现(N+1模式)。超过阈值则通过异步任务推送到企业微信机器人。
from django.db import connection
def install_query_monkey_patch():
original_execute = connection.cursor().execute
def patched_execute(sql, params=None):
start = time.time()
result = original_execute(sql, params)
duration = time.time() - start
if duration > 0.5:
send_slow_query_alert(sql, duration)
return result
connection.cursor().execute = patched_execute