您好,登錄后才能下訂單哦!
本文實例講述了獲取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, 如下是截圖,可以清楚的看到結果:
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程序設計有所幫助。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。