获取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 相关文章推荐
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python实现计算两个时间之间相差天数的方法
May 10 Python
python数据类型_元组、字典常用操作方法(介绍)
May 30 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
信号生成及DFT的python实现方式
Feb 25 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
numpy库reshape用法详解
Apr 19 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
laravel安装zend opcache加速器教程
2015/03/02 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
jQuery中parent()方法用法实例
2015/01/07 Javascript
jQuery实现仿美橙互联两级导航菜单的方法
2015/03/09 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
小试SVG之新手小白入门教程
2019/01/08 Javascript
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
餐厅经理岗位职责范本
2014/02/17 职场文书
给孩子的新年寄语
2014/04/08 职场文书
文明之星事迹材料
2014/05/09 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
Python 全局空间和局部空间
2022/04/06 Python