获取django框架orm query执行的sql语句实现方法分析


Posted in Python onJune 20, 2019

本文实例讲述了获取django框架orm query执行的sql语句实现方法。分享给大家供大家参考,具体如下:

利用Django orM 可以很方便的写出很多查询,但有时候,我们需要检查这些利用 orM 生成的 SQL 语句是否正确,就需要检查这些ORM 生成的 原生的SQL 语句是否正确。经过测试有如下几种方法:

1. 通过数据库的跟踪日志,可以看到查询的语句,比如mysql 就可以配置把所有的 SQL 语句打印到日志中,但这种方式并不推荐,只是没有办法的时候才这么做。

2. 利用django Query 提供的方法. 比如:

queryset = MyModel.objects.all()
 print 'query sql: ' + str(queryset .query)
 #result:

我采用pydev 对 django 进行debug, 如下是截图,可以清楚的看到结果:

获取django框架orm query执行的sql语句实现方法分析

3. 设置settings 里的 debug=True, 这个时候可以用这种方式来获取

from django.db import connections
connections['default'].queries

结果类似如下:

[{u'time': u'0.000', u'sql': u'Select COUNT(*) FROM `my_article` Where `my_article`.`category` = 68 '}]

4. 利用三方提供的middleware 来实现,参考这里: https://djangosnippets.org/snippets/290/

from django.db import connection
from django.conf import settings
import os
def terminal_width():
  """
  Function to compute the terminal width.
  WARNING: This is not my code, but I've been using it forever and
  I don't remember where it came from.
  """
  width = 0
  try:
    import struct, fcntl, termios
    s = struct.pack('HHHH', 0, 0, 0, 0)
    x = fcntl.ioctl(1, termios.TIOCGWINSZ, s)
    width = struct.unpack('HHHH', x)[1]
  except:
    pass
  if width <= 0:
    try:
      width = int(os.environ['COLUMNS'])
    except:
      pass
  if width <= 0:
    width = 80
  return width
class SqlPrintingMiddleware(object):
  """
  Middleware which prints out a list of all SQL queries done
  for each view that is processed. This is only useful for debugging.
  """
  def process_response(self, request, response):
    indentation = 2
    if len(connection.queries) > 0 and settings.DEBUG:
      width = terminal_width()
      total_time = 0.0
      for query in connection.queries:
        nice_sql = query['sql'].replace('"', '').replace(',',', ')
        sql = "\033[1;31m[%s]\033[0m %s" % (query['time'], nice_sql)
        total_time = total_time + float(query['time'])
        while len(sql) > width-indentation:
          print "%s%s" % (" "*indentation, sql[:width-indentation])
          sql = sql[width-indentation:]
        print "%s%s\n" % (" "*indentation, sql)
      replace_tuple = (" "*indentation, str(total_time))
      print "%s\033[1;32m[TOTAL TIME: %s seconds]\033[0m" % replace_tuple
    return response

当然,定义了这个middleware之后,需要修改setting 里的配置

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',
  'yihaomen.common.mymiddleware.SqlPrintingMiddleware', # 这是增加的显示sql语句的middleware
  # Uncomment the next line for simple clickjacking protection:
  # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

结果会打印所有执行的sql 语句, 推荐采用这种方式打印 sql 语句,因为比较方便,而且是插拔式的,不需要的时候去掉这个middleware就可以了,不过这只能在debug 模式下使用,对开发者来说足够了,生产环境不需要debug模式。

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
python基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
在Python中使用SimpleParse模块进行解析的教程
Apr 11 Python
Python测试人员需要掌握的知识
Feb 08 Python
Python面向对象基础入门之设置对象属性
Dec 11 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
Feb 20 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
tensorflow 查看梯度方式
Feb 04 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
Python列表倒序输出及其效率详解
Mar 04 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
Python使用LDAP做用户认证的方法
Jun 20 #Python
Python OpenCV中的resize()函数的使用
Jun 20 #Python
python中的句柄操作的方法示例
Jun 20 #Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 #Python
一篇文章了解Python中常见的序列化操作
Jun 20 #Python
python集合是否可变总结
Jun 20 #Python
Django如何自定义model创建数据库索引的顺序
Jun 20 #Python
You might like
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
zend framework多模块多布局配置
2011/02/26 PHP
PHP 获取ip地址代码汇总
2015/07/05 PHP
基于php编程规范(详解)
2017/08/17 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
javascript 面向对象继承
2009/11/26 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript实现简单的省市区三级联动
2015/05/14 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
Vue组件之Tooltip的示例代码
2017/10/18 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
如何真正的了解python装饰器
2020/08/14 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
小学生评语集锦
2014/04/18 职场文书
商品陈列协议书
2014/09/29 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书