获取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的Django框架中的URL配置与松耦合
Jul 15 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
Windows下python3.6.4安装教程
Jul 31 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
logging level级别介绍
Feb 21 Python
Python3批量创建Crowd用户并分配组
May 20 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Python常用外部指令执行代码实例
Nov 05 Python
python爬虫筛选工作实例讲解
Nov 23 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
pycharm配置QtDesigner的超详细方法
Jan 25 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
Zend公司全球首推PHP认证
2006/10/09 PHP
用PHP查询域名状态whois的类
2006/11/25 PHP
PHP实现懒加载的方法
2015/03/07 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP7 foreach() 函数修改
2021/03/09 PHP
jquery 输入框数字限制插件
2009/11/10 Javascript
模拟select的代码
2011/10/19 Javascript
js生成缩略图后上传并利用canvas重绘
2014/05/15 Javascript
javascript实现设置、获取和删除Cookie的方法
2015/06/01 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python实现自动解数独小程序
2019/01/21 Python
python配置文件写入过程详解
2019/10/19 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
实例讲解使用SVG制作loading加载动画的方法
2016/04/05 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
怎样填写就业意向
2014/04/02 职场文书
销售队伍口号
2014/06/11 职场文书
新闻传播专业求职信
2014/07/22 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
水电工程师岗位职责
2015/02/13 职场文书
锅炉工岗位职责
2015/02/13 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书