获取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中self原理实例分析
Apr 30 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 Python
关于python写入文件自动换行的问题
Jun 23 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
Jul 27 Python
Python给图像添加噪声具体操作
Mar 03 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
python如何删除文件、目录
Jun 23 Python
python Timer 类使用介绍
Dec 28 Python
Python tkinter之ComboBox(下拉框)的使用简介
Feb 05 Python
单身狗福利?Python爬取某婚恋网征婚数据
Jun 03 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
vuex入门最详细整理
2020/03/04 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
Django的models模型的具体使用
2019/07/15 Python
python 变量初始化空列表的例子
2019/11/28 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
使用html2canvas.js实现页面截图并显示或上传的示例代码
2018/12/18 HTML / CSS
小学节能减排倡议书
2014/05/15 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
2015年度信用社工作总结
2015/05/04 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
dubbo服务整合zipkin详解
2021/07/26 Java/Android
Python内置数据类型中的集合详解
2022/03/18 Python