获取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通过websocket与js客户端通信示例分析
Jun 25 Python
Python的内存泄漏及gc模块的使用分析
Jul 16 Python
python各种语言间时间的转化实现代码
Mar 23 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
Python 查看文件的编码格式方法
Dec 21 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
Jul 18 Python
对Python正则匹配IP、Url、Mail的方法详解
Dec 25 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
Python操作redis和mongoDB的方法
Dec 19 Python
Python参数传递实现过程及原理详解
May 14 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
php防止sql注入之过滤分页参数实例
2014/11/03 PHP
简单实现PHP留言板功能
2016/12/21 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
jquery实现抽奖功能
2020/10/22 jQuery
Python采用raw_input读取输入值的方法
2014/08/18 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python制作CSDN免积分下载器
2015/03/10 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python猴子补丁知识点总结
2020/01/05 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
python 基于opencv实现图像增强
2020/12/23 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
房务中心文员岗位职责
2014/04/16 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
临床专业自荐信
2014/06/22 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
认真学习保证书
2015/02/26 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
七年级作文之雪景
2019/11/18 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记