2010-01-25 7 views
8

का उपयोग करके मुझे पाइथन/Django एप्लिकेशन मिला है जो बहुत सारे SQL कथन चलाता है। डिबगिंग उद्देश्यों के लिए, मैंने सोचा कि मुझे मेरे लिए एक साधारण दृश्य बनाना चाहिए जो कि चल रहे सभी SQL कथनों को सूचीबद्ध करता है। जब तक डीबग यह सच है के रूप मेंdjango.db.connection.queries

from django.db import connection 
    connection.queries 

:

प्रलेखन के अनुसार, इस कोड है कि करने के लिए पर्याप्त होना चाहिए।

हालांकि, यह मुझे कुछ भी नहीं दे रहा है। DEBUG निश्चित रूप से सच में सेट है। यह कनेक्शन किस संदर्भ में है। सामान संग्रहित है? मेरा मतलब है, मुझे एक पृष्ठ निष्पादित करने में सक्षम होना चाहिए जो बहुत से SQL कथन निष्पादित करता है, और फिर मैंने बनाए गए http://myserver/sql पर स्विच करें और उन SQL कथनों को वहां देखें, है ना? पाठ्यक्रम के उसी ब्राउज़र सत्र का उपयोग ...

मैंने जांच की है कि कोड में कहीं भी db.reset_queries() चलाया जा रहा है, ऐसा नहीं लगता है।

कोई विचार क्यों कनेक्शन.क्व्यूरीज़ हमेशा खाली है?

उत्तर

17

बेन सही है कि आप केवल वर्तमान प्रक्रिया से प्रश्न देखें। आप इसे उसी दृश्य में या कंसोल में उपयोग कर सकते हैं, लेकिन विचारों के बीच नहीं।

यह देखने का सबसे अच्छा तरीका है कि आपके विचारों में कौन से प्रश्न निष्पादित किए जा रहे हैं Django debug toolbar का उपयोग करना है।

+0

मैं django डीबग टूलबार देखेंगे। धन्यवाद। – HaukurHaf

+0

मुझे उत्पादन सर्वर पर कभी भी डीडीटी चलाने में कोई सफलता नहीं मिली है। यह केवल स्थानीय रूप से चल रहे Django के विकास सर्वर के साथ काम करता प्रतीत होता है। – William

3

मुझे लगता है कि ये प्रश्न स्मृति में संग्रहीत हैं, और प्रक्रियाओं के बीच साझा नहीं किए गए हैं, इसलिए आपको केवल वर्तमान प्रक्रिया द्वारा किए गए प्रश्नों तक पहुंच होगी।

यदि मैं उस कोड को आजमाता हूं जिसे आपने ./manage.py shell सत्र में चिपकाया है, तो मुझे केवल उस शैल सत्र में किए गए प्रश्न दिखाई देते हैं।

यदि मैं एक टेम्पलेट संदर्भ में एक दृश्य से queries पास करता हूं और इसे टेम्पलेट में दिखाता हूं, तो मुझे केवल उस दृश्य में किए गए प्रश्न दिखाई देते हैं। यह देव सर्वर का उपयोग कर रहा है, हालांकि।

मुझे लगता है कि — पर मैंने — का परीक्षण नहीं किया है, यदि आप इसे ऐसे वातावरण में उपयोग करते हैं जहां आपके पास एकाधिक अनुरोधों की एक प्रक्रिया है, तो आप प्रत्येक अनुरोध को सहेजने के लिए और अधिक प्रश्न पूछेंगे।

+0

ठीक है, इसलिए मैं केवल प्रत्येक अनुरोध के भीतर ही काम करूंगा। यह समझ आता है। यह इंगित करने के लिए धन्यवाद कि :-) – HaukurHaf

7

@Daniel Roseman इसकी एक अच्छा विचार है, लेकिन अगर आप बॉक्स से बाहर एसक्यूएल प्रश्नों जानना चाहता हूँ:

django-command-extensions स्थापित करने और इंस्टॉल किए गए एप्लिकेशन में जोड़ें।

  • debugsqlshell: आउटपुट एसक्यूएल निष्पादित हो जाता है कि जैसा कि आप अजगर इंटरैक्टिव खोल में काम यह अपनी परियोजना, उनमें से एक में कई utils आदेशों जोड़ देगा।

उदाहरण: python manage.py debugsqlshell

In [1]:from django.contrib.auth.models import User 
In [1]:User.objects.all() 

Out[2]: SELECT "auth_user"."id", 
    "auth_user"."username", 
    "auth_user"."first_name", 
    "auth_user"."last_name", 
    "auth_user"."email", 
    "auth_user"."password", 
    "auth_user"."is_staff", 
    "auth_user"."is_active", 
    "auth_user"."is_superuser", 
    "auth_user"."last_login", 
    "auth_user"."date_joined" 
    FROM "auth_user" LIMIT 21 [1.25ms] 
2
from django.db import connections 
x = connections['rating'] 
x.queries 

So check another connections! 
0

है यही कारण है कि यह मेरे लिए तय; मैंने उपयोग किया:

reduce(lambda n, name: n + connections[name].queries, connections, 0) 

क्वेरी गिनती प्राप्त करने के लिए।