2011-02-01 10 views
22

सेटअप:
Django 1.1.2, MySQL 5.1कैसे Django क्वेरीसमूह थोक हटाना (अधिक कुशल बनाने के)

समस्या:

Blob.objects.filter(foo = foo) \ 
      .filter(status = Blob.PLEASE_DELETE) \ 
      .delete() 

ORM में यह स्निपेट परिणाम पहले एक SELECT * from xxx_blob where ... क्वेरी पैदा करने, फिर DELETE from xxx_blob where id in (BLAH); कर रहे हैं जहां ब्लैड आईडी की हास्यास्पद रूप से लंबी सूची है। चूंकि मैं बड़ी मात्रा में ब्लॉब्स हटा रहा हूं, इससे मुझे और डीबी दोनों बहुत दुखी होते हैं।

क्या इसके लिए कोई कारण है? मुझे नहीं लगता कि ओआरएम उपरोक्त स्निपेट को एक ही डिलीट क्वेरी में क्यों परिवर्तित नहीं कर सकता है। कच्चे एसक्यूएल का उपयोग किए बिना इसे अनुकूलित करने का कोई तरीका है?

उत्तर

13

अपने स्वयं के कस्टम एसक्यूएल या प्रबंधकों या कुछ लिखने के बिना नहीं; हालांकि वे स्पष्ट रूप से इस पर काम कर रहे हैं।

http://code.djangoproject.com/ticket/9519

+0

यह वास्तव में दुर्भाग्यपूर्ण है। मुझे टिकट पर इंगित करने के लिए धन्यवाद। – svintus

+1

टिकट उस राशन को देता है जिसे आप चाहते थे। यह पूरी तरह से योग्यता के बिना नहीं है। –

3

Bulk delete पहले से ही Django

+4

Queryset.delete() ओपी के वर्णन के रूप में व्यवहार करता है। –

+1

यह अभी भी अक्षम है और परिणाम 'ऑपरेशनल एरर: (2006,' MySQL सर्वर चला गया है ') ' – Andrei

+0

थोक - इस संदर्भ में - इसका मतलब है कि WHERE स्थिति के आधार पर सर्वर पर एक हल्के वजन वाले SQL क्वेरी को निष्पादित किया जाता है। Django ORM की 'डिलीट() 'इस तरह कार्य नहीं करती है। –

9

का हिस्सा है जो अभी भी Django में हटाने के थोक के लिए एक कारगर तरीका के लिए देख रहे हैं उन लोगों के लिए है, यहाँ एक संभव समाधान है:

कारण हटाना() हो सकता है इतनी धीमी हो दो गुना है: 1) django को कैस्केड को सही तरीके से हटाने का काम सुनिश्चित करना है, इस प्रकार अपने मॉडल के लिए विदेशी कुंजी संदर्भों की तलाश करना; 2) django को अपने मॉडल के लिए पूर्व और पोस्ट-सेव सिग्नल को संभालना है।

यदि आप जानते हैं अपने मॉडल, झरना हटाने या संकेतों से संभाला जा की जरूरत नहीं है के रूप में निम्नानुसार आप निजी एपीआई _raw_delete का सहारा द्वारा इस प्रक्रिया को तेज कर सकते हैं: here में

queryset._raw_delete(queryset.db) 

अधिक जानकारी। कृपया ध्यान दें कि django पहले से ही इन घटनाओं का अच्छा संचालन करने की कोशिश करता है, हालांकि कच्चे डिलीट का उपयोग करना, कई स्थितियों में, अधिक कुशल है।

+0

Django इसे क्वेरीसेट से 'bulk_delete' के रूप में सार्वजनिक फ़ंक्शन के रूप में बना सकता है, यही है ना? ऐसा क्यों नहीं किया जाता है? किसी भी उच्च स्तर के कारण? और जो 'bulk_create' का उपयोग करते हैं, वे अच्छी तरह जानते हैं कि सिग्नल काम नहीं करेंगे। सिर्फ कैस्केड हटाने के लिए हो सकता है? – Babu

+0

यह मेरे लिए काम करता है। जैसा कि उल्लेख किया गया मुख्य चेतावनी निर्भर मॉडल ("कैस्केड डिलीट") है - जब तक कि यह किसी भी निर्भरता वाले शीर्ष-प्रकार की तालिका है, यह काम करता है, और वास्तव में तेज़ काम करता है। – nickang

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