获取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实现单线程多任务非阻塞TCP服务端
Jun 13 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
python添加菜单图文讲解
Jun 04 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
python 使用shutil复制图片的例子
Dec 13 Python
python 字段拆分详解
Dec 17 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
在python中修改.properties文件的操作
Apr 08 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
用python写PDF转换器的实现
Oct 29 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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
2014/06/23 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP实现QQ空间自动回复说说的方法
2015/12/02 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
Python内置函数dir详解
2015/04/14 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
详解python解压压缩包的五种方法
2019/07/05 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
Python使用Socket实现简单聊天程序
2020/02/28 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
农民工工资发放承诺书
2014/03/31 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
助人为乐道德模范事迹材料
2014/08/16 职场文书
2016年安全月活动总结
2016/04/06 职场文书
创业项目大全(适合在家创业的项目)
2019/08/15 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
Mysql存储过程、触发器、事件调度器使用入门指南
2022/01/22 MySQL