获取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中的数据存储到系统本地的简单方法
Apr 11 Python
Python中functools模块的常用函数解析
Jun 30 Python
Python中list初始化方法示例
Sep 18 Python
requests和lxml实现爬虫的方法
Jun 11 Python
python多线程抽象编程模型详解
Mar 20 Python
解决.ui文件生成的.py文件运行不出现界面的方法
Jun 19 Python
pyqt5使用按钮进行界面的跳转方法
Jun 19 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
python opencv实现简易画图板
Aug 27 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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 curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
2015/08/17 Javascript
js中获取 table节点各tr及td的内容简单实例
2016/10/14 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
详解python中@的用法
2019/03/27 Python
Django发送邮件功能实例详解
2019/09/02 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
J2EE中常用的名词进行解释
2015/11/09 面试题
统计员岗位职责
2013/11/14 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
安全宣传标语
2014/06/10 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL