文档章节

django页面请求sql分析中间件

农村程序员
 农村程序员
发布于 2015/10/17 22:13
字数 365
阅读 44
收藏 5

很久没有写博客了,记录一些东西吧

写django程序时由于直接和django model交互,对sql的操作不是那么直观。所以很容易造成一些sql查询问题。

如常见的sql分页位置不正确导致查询整个表,多次queryset没有利用缓存导致多次sql重复查询等。之前一直用打印的方式查询,感觉还是不够方便。

于是有了下面的sql中间件,在本地开发时每次输出sql的一些简单分析信息提供参考

class DjangoSqlInspectMiddleware(object):

    def process_request(self, request):
        self.start_end_chars_dict = {'start_chars': '<' * 20, 'end_chars': '>' * 20}

        self.start = time.time()
        logger.info(os.linesep * 4)
        logger.info('%(start_chars)s sql analyse start %(end_chars)s' % self.start_end_chars_dict)

    def process_response(self, request, response):
        sqltime_list = connection.queries
        pprint.pprint(sqltime_list)

        duplicate_sqltime_dict = defaultdict(int)
        sql_total_time = 0
        max_sqltime, min_sqltime = (None,) * 2
        for st in sqltime_list:
            sql = st['sql']
            sql_total_time += float(st['time'])
            duplicate_sqltime_dict[sql] = duplicate_sqltime_dict[sql] + 1
            if not max_sqltime or not min_sqltime:
                max_sqltime = min_sqltime = st
            else:
                t = st['time']
                if t > max_sqltime['time']:
                    max_sqltime = st
                if t < min_sqltime['time']:
                    min_sqltime = st

        self.end = time.time()
        consume_time = self.end - self.start
        logger.info('[SQL] %s queries, %s SQL time, %s total request time' %
                    (len(duplicate_sqltime_dict), sql_total_time, consume_time))

        logger.info('[MAX TIME]: %s seconds' % (max_sqltime['time'], ))
        logger.info('[MAX TIME SQL]:%s %s' % (os.linesep, max_sqltime['sql']))

        logger.info('[MIN TIME]: %s seconds' % min_sqltime['time'])
        logger.info('[MIN TIME SQL]:%s %s' % (os.linesep, min_sqltime['sql']))

        logger.info('[CHECK DUPLICATE]:')
        for k, v in duplicate_sqltime_dict.iteritems():
            if v > 1:
                logger.info('(%s)' % v + k)
                logger.info('---------------------------------------------')
        logger.info('%(start_chars)s sql analyse end %(end_chars)s' % self.start_end_chars_dict)
        logger.info(os.linesep * 2)
        return response

主要程序如上, 如果感兴趣的同学可以在github上一起完善或者有更好的方式给予建议哈

https://github.com/lyroge/django-sqlinspect

© 著作权归作者所有

共有 人打赏支持
农村程序员
粉丝 13
博文 17
码字总数 7273
作品 0
丰台
高级程序员
分析检查工具--Django Silk

Silk是一个Django框架的分析检查工具,功能主要包括: 通过中间件拦截请求/响应 围绕SQL执行情况进行数据库的查询和分析 通过Python装饰器进行手动、动态地分析代码块和函数。 提供上述检测手...

renwofei423
2014/06/17
327
0
Django 事务小结

官方关于事务的说明 Django 默认的事务行为(Django’s default transaction behavior) Django 默认情况下是运行一个打开的事务,这个事务在 model 中引起了数据变动的内置函式被调用时,就会...

楠木楠
2016/09/28
443
0
Django内置的中间件说明

可用的中间件 缓存中间件 class UpdateCacheMiddleware class FetchFromCacheMiddleware 开启全站范围的缓存。 如果开启了这些缓存,任何一个由Django提供的页面将会被缓存,缓存时长是由你在...

楠木楠
2016/10/11
210
0
django 1.8 官方文档翻译: 3-6-2 内建的中间件

Django 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质。 交流群:467338606 网站:http://python.usyiyi.cn/django/index.html 中间件 这篇文档介绍了Django自带的所有...

apachecn_飞龙
2015/07/28
0
0
【精华】【学以致用】Django精华总结

简单入门和梳理 1、WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 ############## WEB:MVC、MTV 2、Django #安装 pip3 i...

Asktao
2017/10/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash脚本输入参数的使用

Bash脚本输入参数的使用 Bash脚本传入的参数,在脚本中以位置的形式进行访问,即 $n 。例如,$1 为执行脚本的第一个参数,$2 为执行脚本的第二个参数。另外Bash中还提供了一些其它的便捷操作...

小陶小陶
20分钟前
1
0
多线程场景下,触发OOM的线程是否会影响其他线程的工作

public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { int i = 0;......

麦馍
24分钟前
2
0
模拟Dubbo的zookeeper一致性Hash发现

接之前一篇<手写zookeeper来模拟dubbo的注册/发现>,使用一致性Hash来进行查找需要寻找的服务. Hash处理接口 public interface HashFunc { public Long hash(Object key);} 一致性Has...

算法之名
35分钟前
13
0
#mysql50# not Exist

data 目录有中文名称,可能是复制的"复件...."

少年不搬砖老大徒伤悲
49分钟前
1
0
在yii2中,让你action参数支持POST数据的小方法

我们先来看一段代码 class RaController extends Controller { public $enableCsrfValidation = false; public function actionSay($username = '',$city = ''){ echo "{$......

阿北2017
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部