2010-09-20 69 views
219

如何從QuerySet對象獲取Django將在數據庫中使用的SQL?我試圖調試一些奇怪的行爲,但我不知道什麼查詢要去數據庫。謝謝你的幫助。從Django查詢集獲取SQL

+1

這不是重複。相關的問題是一個完全不同的話題。 – craigds 2017-03-23 20:45:32

回答

331

您打印查詢集的query屬性。

>>> queryset = MyModel.objects.all() 
>>> print queryset.query 
SELECT "myapp_mymodel"."id", ... FROM "myapp_mymodel" 
+0

我發現[this](https://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/#automatic-spatial-transformations)其中隱含地提到它,但沒有明確說明上述 – hanleyhansen 2013-09-24 22:41:53

+10

請注意, 'query'的輸出不是有效的SQL,因爲「Django從未實際插入參數:它將查詢和參數分別發送到數據庫適配器,該適配器執行適當的操作。」來源:https://code.djangoproject.com/ticket/17741 – gregoltsov 2014-07-07 14:50:10

+0

我在哪裏寫查詢... MyModel是在models.py文件中的一個類...我的疑問是,我必須編寫SQL查詢從表中檢索值。 – 2014-11-17 07:10:59

48

簡單:

print my_queryset.query 

例如:

from django.contrib.auth.models import User 
print User.objects.filter(last_name__icontains = 'ax').query 

還應該提到的是,如果你有DEBUG = True,則所有的疑問都會被記錄下來,並可以通過訪問connection.queries獲取它們:

from django.db import connections 
connections['default'].queries 

django debug toolbar項目使用它以整潔的方式在頁面上顯示查詢。

+1

這並不總是輸出有效的SQL,請參閱其他答案 – aehlke 2014-07-21 21:12:08

+1

如果不先執行查詢,就無法獲得實際的SQL,最終的SQL由周圍的RDBMS驅動程序生成,而不是由Django生成。答案是正確的,因爲它是使用Django QuerySet獲得的最多答案。 – danigosa 2016-01-10 07:48:59

26

The accepted answer在使用Django 1.4.4時不適用於我。而不是原始查詢,返回對查詢對象的引用:<django.db.models.sql.query.Query object at 0x10a4acd90>

下返回的查詢:

>>> queryset = MyModel.objects.all() 
>>> queryset.query.__str__() 
+23

它可能不起作用,因爲你只是鍵入'queryset.query'而不是'print queryset.query',它調用'__str __()' – hughes 2013-05-28 17:49:45

+7

@hughes是正確的。如果你不想打印它並想把它作爲一個字符串,而不是調用'__str __()'把它作爲一個字符串,你應該做'str(queryset.query)'。 – Chad 2013-05-30 23:31:44

+1

我正在使用ipdb進行調試,並在執行'p queryset'時打印對查詢對象的引用。 'p queryset .__ str __()'產生期望的結果,所以這是一個更好的答案。 – Rafay 2014-06-25 05:15:27