获取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读取浮点数和读取文本文件示例
May 06 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
简单的编程0基础下Python入门指引
Apr 01 Python
Python读写ini文件的方法
May 28 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
Python中生成Epoch的方法
Apr 26 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
python经典趣味24点游戏程序设计
Jul 26 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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获得用户ip地址的比较不错的方法
2014/02/08 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
理解JS绑定事件
2016/01/19 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
js实现消息滚动效果
2017/01/18 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
VUE中V-IF条件判断改变元素的样式操作
2020/08/09 Javascript
JS实现小米轮播图
2020/09/21 Javascript
Python实现身份证号码解析
2015/09/01 Python
Python数组定义方法
2016/04/13 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
美国领先的家居装饰和礼品商店:Kirkland’s
2017/01/30 全球购物
世界领先的电子书网站:eBooks.com(在线购买小说、非小说和教科书)
2019/03/30 全球购物
员工入职担保书范文
2014/04/01 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
清洁工岗位职责
2015/02/13 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
Python字典和列表性能之间的比较
2021/06/07 Python
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android