获取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根据经纬度计算距离示例
Feb 16 Python
python获取标准北京时间的方法
Mar 24 Python
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
详解Python二维数组与三维数组切片的方法
Jul 18 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
详解python UDP 编程
Aug 24 Python
python zip()函数的使用示例
Sep 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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
Vue 源码分析之 Observer实现过程
2018/03/29 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
Python贪心算法实例小结
2018/04/22 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
python缩进长度是否统一
2020/08/02 Python
Python try except else使用详解
2021/01/12 Python
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
党的群众路线学习笔记
2014/11/06 职场文书
5.12护士节活动总结
2015/02/10 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
工程款申请报告
2015/05/15 职场文书
药房管理制度范本
2015/08/06 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python