獲取django框架orm query執(zhí)行的sql語句實現(xiàn)方法分析
本文實例講述了獲取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, 如下是截圖,可以清楚的看到結(jié)果:

3. 設(shè)置settings 里的 debug=True, 這個時候可以用這種方式來獲取
from django.db import connections connections['default'].queries
結(jié)果類似如下:
[{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', )
結(jié)果會打印所有執(zhí)行的sql 語句, 推薦采用這種方式打印 sql 語句,因為比較方便,而且是插拔式的,不需要的時候去掉這個middleware就可以了,不過這只能在debug 模式下使用,對開發(fā)者來說足夠了,生產(chǎn)環(huán)境不需要debug模式。
希望本文所述對大家基于Django框架的Python程序設(shè)計有所幫助。
- Pycharm+django2.2+python3.6+MySQL實現(xiàn)簡單的考試報名系統(tǒng)
- python3.6+django2.0+mysql搭建網(wǎng)站過程詳解
- django連接mysql配置方法總結(jié)(推薦)
- Django讀取Mysql數(shù)據(jù)并顯示在前端的實例
- Django重裝mysql后啟動報錯:No module named ‘MySQLdb’的解決方法
- Django+mysql配置與簡單操作數(shù)據(jù)庫實例代碼
- Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫教程
- python Django連接MySQL數(shù)據(jù)庫做增刪改查
- 調(diào)試Django時打印SQL語句的日志代碼實例
相關(guān)文章
python數(shù)據(jù)處理 根據(jù)顏色對圖片進行分類的方法
今天小編就為大家分享一篇python數(shù)據(jù)處理 根據(jù)顏色對圖片進行分類的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python re正則匹配網(wǎng)頁中圖片url地址的方法
今天小編就為大家分享一篇python re正則匹配網(wǎng)頁中圖片url地址的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
python 解決flask uwsgi 獲取不到全局變量的問題
今天小編就為大家分享一篇python 解決flask uwsgi 獲取不到全局變量的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
使用wxPython和OpenCV實現(xiàn)手勢識別相機功能
在這篇博客中,我將分享一個有趣的?Python?項目:通過?wxPython?創(chuàng)建圖形界面,利用?OpenCV?的計算機視覺技術(shù)實現(xiàn)實時手勢識別,以下是項目的完整實現(xiàn)過程,包括代碼分析、使用說明和可能的優(yōu)化建議,需要的朋友可以參考下2025-04-04
python網(wǎng)絡(luò)爬蟲實現(xiàn)發(fā)送短信驗證碼的方法
這篇文章主要介紹了python網(wǎng)絡(luò)爬蟲實現(xiàn)發(fā)送短信驗證碼的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Pandas中把dataframe轉(zhuǎn)成array的方法
下面小編就為大家分享一篇Pandas中把dataframe轉(zhuǎn)成array的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python對站點數(shù)據(jù)做EOF且做插值繪制填色圖
這篇文章主要介紹了python對站點數(shù)據(jù)做EOF且做插值繪制填色圖,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,,需要的小伙伴可以參考一下2022-09-09
Python實現(xiàn)判斷一個整數(shù)是否為回文數(shù)算法示例
這篇文章主要介紹了Python實現(xiàn)判斷一個整數(shù)是否為回文數(shù)算法,結(jié)合實例形式分析了Python針對字符串的翻轉(zhuǎn)、判斷等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03

