Django ORM की क्वेरी की संगत SQL क्वेरी कैसे देखें?


164

क्या कोई ऐसा तरीका है जिससे मैं उस क्वेरी को प्रिंट कर सकता हूं जिसे Django ORM जेनरेट कर रहा है?

कहो मैं निम्नलिखित कथन पर अमल करता हूं: Model.objects.filter(name='test')

मैं उत्पन्न SQL क्वेरी कैसे देख सकता हूँ?

जवाबों:


178

प्रत्येक QuerySet ऑब्जेक्ट में एक queryविशेषता है कि आप डीबगिंग उद्देश्यों के लिए लॉगआउट या प्रिंट कर सकते हैं।

qs = Model.objects.filter(name='test')
print qs.query

संपादित करें

मैंने HTML टिप्पणियों के रूप में एकल अनुरोध के दायरे में प्रश्नों को इंजेक्ट करने के लिए कस्टम टेम्पलेट टैग ( इस स्निपेट में उल्लिखित ) का भी उपयोग किया है ।


6
.save () के लिए प्रश्नों के बारे में क्या?
11

@DataGreed अच्छा सवाल, एक नए सूत्र में पूछने के लायक हो सकता है ताकि आपको अधिक प्रतिक्रियाएं मिलें।
जो होलोवे

4
यह prefetch_related2 प्रश्नों के साथ काम करता है ? मैं केवल 1 देखता हूं
उपयोगकर्ता

काम नहीं करता। मैं देख रहा हूं<django.db.models.sql.query.Query object
dopatraman

प्रिंट का प्रयास करें (str (qs.query))। मुझे लगता है कि उन्होंने 10 वर्षों में
जो होलोवे

114

तुम भी Django द्वारा उत्पन्न सभी प्रश्नों को लॉग करने के लिए अजगर लॉगिंग का उपयोग कर सकते हैं। बस इसे अपनी सेटिंग फ़ाइल में जोड़ें।

LOGGING = {
    'disable_existing_loggers': False,
    'version': 1,
    'handlers': {
        'console': {
            # logging handler that outputs log messages to terminal
            'class': 'logging.StreamHandler',
            'level': 'DEBUG', # message level to be written to console
        },
    },
    'loggers': {
        '': {
            # this sets root level logger to log debug and higher level
            # logs to console. All other loggers inherit settings from
            # root level logger.
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': False, # this tells logger to send logging message
                                # to its parent (will send if set to True)
        },
        'django.db': {
            # django also has database level logging
        },
    },
}

मामले के अनुप्रयोग में एक और विधि html आउटपुट उत्पन्न कर रही है - django डिबग टूलबार का उपयोग किया जा सकता है।


3
यदि किसी को निष्पादित प्रश्नों की संख्या के सारांश के साथ- साथ कुल समय भी लगता है: dabapps.com/blog/log-sql-queries-django-13
andilabs

9
यह मेरे लिए काम नहीं किया, मुझे 'level': 'DEBUG'नीचे जोड़ना पड़ा 'django.db'
रवर्निका

108

आप इस कोड को अपने शेल पर पेस्ट कर सकते हैं जो सभी एसक्यूएल प्रश्नों को प्रदर्शित करेगा:

# To get all sql queries sent by Django from py shell
import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())

72

जब तक DEBUGहै:

from django.db import connection
print(connection.queries)

एक व्यक्तिगत प्रश्न के लिए, आप यह कर सकते हैं:

print(Model.objects.filter(name='test').query)

22
पाठकों के लिए ध्यान दें: Djagno 1.2 के बाद से ऑब्जेक्ट queryलौटाता हैQuery जिसमें as_sqlविशेषता नहीं है ।
लूसिक

30

शायद आपको django-debug-toolbarआवेदन पर एक नज़र डालनी चाहिए , यह आपके लिए सभी प्रश्नों को लॉग करेगा, उनके लिए प्रोफाइलिंग जानकारी प्रदर्शित करेगा और बहुत कुछ।


3
यह बहुत उपयोगी है, लेकिन यह केवल GUI में काम करता है और कभी-कभी आप सीधे ORM में क्वेरी लॉग देखना चाहते हैं। जैसे कि आपके पास एक एपीआई है, जिसमें कोई GUI नहीं है!
विम

3

एक मजबूत समाधान आपके डेटाबेस सर्वर को एक फ़ाइल में लॉग इन करना होगा

tail -f /path/to/the/log/file.log

2

यदि आप डेटाबेस रूटिंग का उपयोग कर रहे हैं, तो संभवतः आपके पास एक से अधिक डेटाबेस कनेक्शन हैं। इस तरह कोड आपको एक सत्र में कनेक्शन देखने देता है। आप एक ही कनेक्शन के साथ उसी तरह से आँकड़े रीसेट कर सकते हैं:reset_queries()

from django.db import connections,connection,reset_queries
...
reset_queries()  # resets data collection, call whenever it makes sense

...

def query_all():
    for c in connections.all():
        print(f"Queries per connection: Database: {c.settings_dict['NAME']} {c.queries}")

# and if you just want to count the number of queries
def query_count_all()->int:
    return sum(len(c.queries) for c in connections.all() )

1

SQL क्वेरी देखने के लिए आप Django डीबग_टूलबार का उपयोग कर सकते हैं। Debug_toolbar उपयोग के लिए चरण दर चरण मार्गदर्शिका:

Debug_toolbar स्थापित करें

pip install django-debug-toolbar

सेटिंग थिंकपैड फ़ाइल संपादित करें और इंस्टॉल किए गए ऐप्स में debug_toolbar जोड़ें, इसे 'django.contrib.staticfiles' के नीचे जोड़ा जाना चाहिए। इसके अलावा debug_toolbar को Middleware में जोड़ें।

Settings.py =>

INSTALLED_APPS= [ 'debug_toolbar'] 

MIDDLEWARE = ['debug_toolbar.middleware.DebugToolbarMiddleware']

एक नई सूची बनाएँ, जिसका नाम INTERNAL_IPS है सेटिंग्स फ़ाइल में

Settings.py => नई सूची बनाएं settings.py फ़ाइल के अंत में और नीचे दी गई सूची जोड़ें:

INTERNAL_IPS= [127.0.0.1']

यह डीबग को केवल आंतरिक डेवलपमेंट सर्वर पर चलाने की अनुमति देगा

#Project की urls.py फ़ाइल संपादित करें और नीचे कोड जोड़ें:

if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
    url(r'^__debug__/', include(debug_toolbar.urls))       
    ] + urlpatterns

माइग्रेट लागू करें और फिर से सर्वर चलाएं

आपको अपने वेब पेज पर 127.0.0.1 पर एक ऐड-ऑन दिखाई देगा और यदि आप SQL क्वेरी चेक बॉक्स पर क्लिक करते हैं, तो आप वास्तव में क्वेरी का रन समय भी देख सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.