获取django框架orm query执行的sql语句实现方法分析

作者:轻舞肥羊 时间:2021-06-08 08:37:41 

本文实例讲述了获取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程序设计有所帮助。

来源:http://www.yihaomen.com/article/python/448.htm

标签:django,orm,query,sql语句
0
投稿

猜你喜欢

  • 详解numpy.ndarray.reshape()函数的参数问题

    2022-02-06 20:22:57
  • python循环控制之break和continue流程控制语句

    2021-02-05 15:22:29
  • Go Plugins插件的实现方式

    2023-10-15 01:51:20
  • python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例

    2024-01-22 03:53:51
  • vue实现父子组件之间的通信以及兄弟组件的通信功能示例

    2024-05-21 10:15:43
  • asp如何验证字符串是否包含有效字符?

    2009-11-08 19:02:00
  • mysql慢查询的分析方法

    2010-08-03 14:51:00
  • Python安全获取域管理员权限几种方式操作示例

    2022-10-04 01:14:15
  • java使用正则表达式查找包含的字符串示例

    2022-06-18 21:02:08
  • Python实现像awk一样分割字符串

    2022-07-29 18:42:07
  • Python爬虫实战之爬取携程评论

    2022-02-03 14:26:23
  • Python图像处理之图像拼接

    2021-08-14 19:27:41
  • python3在各种服务器环境中安装配置过程

    2021-10-27 22:49:55
  • MySQL 数据库 like 语句通配符模糊查询小结

    2024-01-20 03:41:30
  • django项目环境搭建及在虚拟机本地创建django项目的教程

    2022-10-14 14:04:32
  • 零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版

    2022-12-20 08:32:42
  • python实现断点调试的方法

    2021-07-01 07:49:40
  • python去除字符串中的空格、特殊字符和指定字符的三种方法

    2022-06-12 20:21:31
  • Django+Celery实现动态配置定时任务的方法示例

    2021-06-11 13:56:19
  • 在Django admin中编辑ManyToManyField的实现方法

    2021-03-05 18:03:47
  • asp之家 网络编程 m.aspxhome.com