文档章节

django页面请求sql分析中间件

农村程序员
 农村程序员
发布于 2015/10/17 22:13
字数 365
阅读 46
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

Java springcloud B2B2C o2o多用户商城 springcloud架构-docker-feign配置(五)

简介 上一节我们讨论了怎么用feign声明式调用cloud的生产者,这节我们讨论一下feign配置,通过编写配置类,我们可以自定义feign的日志级别,日志扫描目录,可以通过feign调用服务在eureka上的...

sccspuercode
29分钟前
2
0
长连接的心跳及重连设计

前言 说道“心跳”这个词大家都不陌生,当然不是指男女之间的心跳,而是和长连接相关的。 顾名思义就是证明是否还活着的依据。 什么场景下需要心跳呢? 目前我们接触到的大多是一些基于长连接...

crossoverJie
30分钟前
3
0
OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
901
13
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
4
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部