获取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 31 Python
Django中更新多个对象数据与删除对象的方法
Jul 17 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
Apr 18 Python
python 执行shell命令并将结果保存的实例
May 11 Python
python去除文件中重复的行实例
Jun 29 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
python 实现12bit灰度图像映射到8bit显示的方法
Jul 08 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
python计算导数并绘图的实例
Feb 29 Python
Django之腾讯云短信的实现
Jun 12 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jQuery之选择组件的深入解析
2013/06/19 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
压缩包密码破解示例分享(类似典破解)
2014/01/17 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
实时获取Python的print输出流方法
2019/01/07 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
Python tkinter和exe打包的方法
2020/02/05 Python
为什么相对PHP黑python的更少
2020/06/21 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
Christys’ Hats官网:英国帽子制造商
2018/11/28 全球购物
学生期末评语大全
2014/04/30 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
餐厅开业活动方案
2019/07/08 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏