溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

獲取django框架orm query執(zhí)行的sql語句實現(xiàn)方法分析

發(fā)布時間:2020-09-26 16:26:25 來源:腳本之家 閱讀:203 作者:輕舞肥羊 欄目:開發(fā)技術

本文實例講述了獲取django框架orm query執(zhí)行的sql語句實現(xiàn)方法。分享給大家供大家參考,具體如下:

利用Django orM 可以很方便的寫出很多查詢,但有時候,我們需要檢查這些利用 orM 生成的 SQL 語句是否正確,就需要檢查這些ORM 生成的 原生的SQL 語句是否正確。經(jīng)過測試有如下幾種方法:

1. 通過數(shù)據(jù)庫的跟蹤日志,可以看到查詢的語句,比如mysql 就可以配置把所有的 SQL 語句打印到日志中,但這種方式并不推薦,只是沒有辦法的時候才這么做。

2. 利用django Query 提供的方法. 比如:

 queryset = MyModel.objects.all()
 print 'query sql: ' + str(queryset .query)
 #result:

我采用pydev 對 django 進行debug, 如下是截圖,可以清楚的看到結果:

獲取django框架orm query執(zhí)行的sql語句實現(xiàn)方法分析

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 來實現(xiàn),參考這里: 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',
)

結果會打印所有執(zhí)行的sql 語句, 推薦采用這種方式打印 sql 語句,因為比較方便,而且是插拔式的,不需要的時候去掉這個middleware就可以了,不過這只能在debug 模式下使用,對開發(fā)者來說足夠了,生產(chǎn)環(huán)境不需要debug模式。

希望本文所述對大家基于Django框架的Python程序設計有所幫助。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI