获取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封装对象实现时间效果
Apr 23 Python
Python实现批量下载图片的方法
Jul 08 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Python实现生成随机数据插入mysql数据库的方法
Dec 25 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
python实现扫描ip地址的小程序
Apr 16 Python
给我一面国旗 python帮你实现
Sep 30 Python
python字典和json.dumps()的遇到的坑分析
Mar 11 Python
python numpy库np.percentile用法说明
Jun 08 Python
快速了解Python开发环境Spyder
Jun 29 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
Python获取指定日期是"星期几"的6种方法
Mar 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
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
2013/07/01 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
Vue项目利用axios请求接口下载excel
2020/11/17 Vue.js
python实现简单的socket server实例
2015/04/29 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
注塑工厂厂长岗位职责
2013/12/02 职场文书
小学“向国旗敬礼”网上签名寄语活动总结
2014/09/27 职场文书
优秀高中学生评语
2014/12/30 职场文书
采购员岗位职责范本
2015/04/07 职场文书
体育教师研修感悟
2015/11/18 职场文书
《去年的树》教学反思
2016/02/18 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL
Python实现的扫码工具居然这么好用!
2021/06/07 Python