獲取django框架orm query執(zhí)行的sql語(yǔ)句實(shí)現(xiàn)方法分析
本文實(shí)例講述了獲取django框架orm query執(zhí)行的sql語(yǔ)句實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:
利用Django orM 可以很方便的寫出很多查詢,但有時(shí)候,我們需要檢查這些利用 orM 生成的 SQL 語(yǔ)句是否正確,就需要檢查這些ORM 生成的 原生的SQL 語(yǔ)句是否正確。經(jīng)過測(cè)試有如下幾種方法:
1. 通過數(shù)據(jù)庫(kù)的跟蹤日志,可以看到查詢的語(yǔ)句,比如mysql 就可以配置把所有的 SQL 語(yǔ)句打印到日志中,但這種方式并不推薦,只是沒有辦法的時(shí)候才這么做。
2. 利用django Query 提供的方法. 比如:
queryset = MyModel.objects.all() print 'query sql: ' + str(queryset .query) #result:
我采用pydev 對(duì) django 進(jìn)行debug, 如下是截圖,可以清楚的看到結(jié)果:
3. 設(shè)置settings 里的 debug=True
, 這個(gè)時(shí)候可以用這種方式來獲取
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 來實(shí)現(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
當(dāng)然,定義了這個(gè)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語(yǔ)句的middleware # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', )
結(jié)果會(huì)打印所有執(zhí)行的sql 語(yǔ)句, 推薦采用這種方式打印 sql 語(yǔ)句,因?yàn)楸容^方便,而且是插拔式的,不需要的時(shí)候去掉這個(gè)middleware就可以了,不過這只能在debug 模式下使用,對(duì)開發(fā)者來說足夠了,生產(chǎn)環(huán)境不需要debug模式。
希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。
- Pycharm+django2.2+python3.6+MySQL實(shí)現(xiàn)簡(jiǎn)單的考試報(bào)名系統(tǒng)
- python3.6+django2.0+mysql搭建網(wǎng)站過程詳解
- django連接mysql配置方法總結(jié)(推薦)
- Django讀取Mysql數(shù)據(jù)并顯示在前端的實(shí)例
- Django重裝mysql后啟動(dòng)報(bào)錯(cuò):No module named ‘MySQLdb’的解決方法
- Django+mysql配置與簡(jiǎn)單操作數(shù)據(jù)庫(kù)實(shí)例代碼
- Django1.7+python 2.78+pycharm配置mysql數(shù)據(jù)庫(kù)教程
- python Django連接MySQL數(shù)據(jù)庫(kù)做增刪改查
- 調(diào)試Django時(shí)打印SQL語(yǔ)句的日志代碼實(shí)例
相關(guān)文章
Python中的枚舉函數(shù)enumerate()的具體用法
本文主要介紹了Python中的枚舉函數(shù)enumerate()的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換
經(jīng)常會(huì)遇到圖片格式需要轉(zhuǎn)換的情況,這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖片格式轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì)、實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08Python Pytorch深度學(xué)習(xí)之?dāng)?shù)據(jù)加載和處理
今天小編就為大家分享一篇Pytorch 數(shù)據(jù)加載與數(shù)據(jù)預(yù)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-10-10Pickle模塊中的dump()和load()方法簡(jiǎn)介
Pickle模塊實(shí)現(xiàn)了基本的數(shù)據(jù)序列化與反序列化操作,通過序列化操作,我們可以將程序中運(yùn)行的對(duì)象信息轉(zhuǎn)化為字節(jié)流保存到文件中去,永久存儲(chǔ)在磁盤上,這篇文章主要介紹了Pickle模塊中的dump()和load()方法介紹,需要的朋友可以參考下2023-03-03