获取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实现合并两个数组的方法
May 16 Python
[原创]Python入门教程4. 元组基本操作
Oct 31 Python
对python中dict和json的区别详解
Dec 18 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
学习python可以干什么
Feb 26 Python
python中的数据结构比较
May 13 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
Aug 19 Python
基于python实现操作redis及消息队列
Aug 27 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
Python爬虫基础之爬虫的分类知识总结
May 13 Python
这样写python注释让代码更加的优雅
Jun 02 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 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
php接口技术实例详解
2016/12/07 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
手动实现把python项目发布为exe可执行程序过程分享
2014/10/23 Python
Python打印scrapy蜘蛛抓取树结构的方法
2015/04/08 Python
python实现telnet客户端的方法
2015/04/15 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
python requests.post带head和body的实例
2019/01/02 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
python对Excel的读取的示例代码
2020/02/14 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
事业单位公务员的职业生涯规划
2014/01/15 职场文书
空中乘务员岗位职责
2014/03/08 职场文书
个人典型事迹材料
2014/12/30 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技