获取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中使用mechanize模块模拟浏览器功能
May 05 Python
Python简单删除目录下文件以及文件夹的方法
May 27 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
详解Python中的array数组模块相关使用
Jul 05 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
python抓取文件夹的所有文件
Feb 27 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
Python编程快速上手——正则表达式查找功能案例分析
Feb 28 Python
查看已安装tensorflow版本的方法示例
Apr 19 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
php调用dll的实例操作动画与代码分享
2012/08/14 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
Vue组件开发初探
2017/02/14 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
JavaScript 异步调用
2017/10/25 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
Python科学计算环境推荐——Anaconda
2014/06/30 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Python requests库用法实例详解
2018/08/14 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
通信专业个人自我鉴定
2013/10/21 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书