2010-07-27 11 views
6

क्या यह जांचना संभव है कि किसी क्वेरी द्वारा कितनी पंक्तियां हटा दी गईं?कितनी पंक्तियां हटा दी गईं?

queryset = MyModel.object.filter(foo=bar) 
queryset.delete() 
deleted = ... 

या क्या मुझे इसके लिए लेनदेन का उपयोग करना चाहिए?

@transaction.commit_on_success 
def delete_some_rows(): 
    queryset = MyModel.object.filter(foo=bar) 
    deleted = queryset.count() 
    queryset.delete() 

पीएचपी + MySQL उदाहरण:

mysql_query('DELETE FROM mytable WHERE id < 10'); 
printf("Records deleted: %d\n", mysql_affected_rows()); 
+0

हम्म, अच्छी तरह से 'queryset.delete()' ऑब्जेक्ट्स की 'लेन (क्वेरीसेट)' संख्या को हटा देना चाहिए, लेकिन MySQL से प्रभावित पंक्तियों की संख्या प्राप्त करने के लिए आपको [MySQLdb] का उपयोग करना चाहिए (http: // mysql-python .sourceforge.net/MySQLdb.html) ड्राइवर सीधे मुझे लगता है। –

उत्तर

0

मुझे समझ नहीं आता क्यों queryset.count() या queryset.distinct().count() पर्याप्त नहीं है।

+2

यह पर्याप्त है, लेकिन यह और अधिक प्रश्नों का उत्पादन करता है। PHP + MySQL उदाहरण केवल डीबीएमएस के लिए गायन अनुरोध है। आईएमओ PHP कोड भी अधिक स्पष्ट है। मेरे पास प्रदर्शन समस्या या कुछ नहीं है, इसलिए मुझे इसे एक प्रश्न में करना होगा। मैं सिर्फ उत्सुक हूँ। –

+2

आप अंतर्निहित 'MySQLdb' कर्सर की' पंक्ति गणना 'विशेषता तक पहुंच भी प्राप्त कर सकते हैं, लेकिन यह हैक-आईएसएच है: 'base_cursor = connection.cursor() कर्सर' (या' base_cursor = connection.cursor() कर्सर। कर्सर 'अगर 'DEBUG' को' True' पर सेट किया गया है)। –

+1

आपको यह समझना होगा कि ओआरएम जो आप Django में उपयोग कर रहे हैं वह एक अबास्ट्रक्शन लेयर है, फिर डेटाबेस ड्राइवर जो आपके ऐप को डेटाबेस अज्ञेयवादी होने की इजाजत देता है, लेकिन आप अभी भी डेटाबेस ड्राइवर का उपयोग कर सकते हैं जैसे अंतर्निहित डेटाबेस के साथ संवाद करने के लिए आप अपने PHP उदाहरण में करते हैं , लेकिन आप अपना ऐप डेटाबेस निर्भर करेंगे। –

2

ऐसी कई स्थितियां हैं जहां आप जानना चाहते हैं कि कितनी पंक्तियां हटा दी गई थीं, उदाहरण के लिए यदि आप कुछ पंक्तियों को हटाते हैं, तो आप कुछ करते हैं। COUNT को निष्पादित करके इसे जांचना अतिरिक्त डेटाबेस लोड बनाता है और परमाणु नहीं है।

queryset.delete() विधि तुरंत ऑब्जेक्ट को हटा देती है और ऑब्जेक्ट्स की संख्या को हटा देती है और प्रति ऑब्जेक्ट प्रकार को हटाने की संख्या के साथ एक शब्दकोश देता है। अधिक जानकारी के लिए दस्तावेज़ों की जांच करें: https://docs.djangoproject.com/en/1.9/topics/db/queries/#deleting-objects

0

वास्तविक पंक्तियों से प्रभावित आप SELECT row_count() के साथ देख सकते हैं। सबसे पहले qs.count() और cursor.rowcount समान चीजें नहीं हैं!

रीसाइटेबल रीड (डिफ़ॉल्ट मोड) के साथ InnoDB के साथ MySQL में पढ़ें प्रश्न और WRITE क्वेरी देखें !! अलग !!! क्वेरीसेट्स!

पुराने स्नैपशॉट से पढ़े गए प्रश्न पढ़ें, जबकि WRITE क्वेरी वास्तविक प्रतिबद्ध डेटा देखते हैं, जैसे वे READ COMMITTED मोड में काम करते हैं।

संबंधित मुद्दे