2012-01-26 1 views
6

Django 1.3x का उपयोग करना।क्या मैं आसानी से UPPER() के बजाय लोअर() का उपयोग करने के लिए Django ORM 'iexact' से अधिक सवारी कर सकता हूं?

वर्तमान में मेरे पास बहुत, बहुत बड़ा और बहुत ही सक्रिय पोस्टग्रेस डेटा सेट है जिसमें lower(column) के रूप में अनुक्रमित एक महत्वपूर्ण कॉलम है।

मुझे अभी एहसास हुआ कि कुछ सामान्य प्रश्न काफी धीमे थे क्योंकि Django ORM उस क्षेत्र से मेल खाने के लिए iexact का उपयोग कर रहा है जब blah = UPPER(column) के रूप में फ़ील्ड के लिए एक क्वेरी उत्पन्न कर रहा है।

क्या ओआरएम को इसके बजाय lower() का उपयोग करने के लिए मजबूर करने का एक आसान तरीका है, या मुझे इसके लिए कच्चे एसक्यूएल में ड्रॉप करने की आवश्यकता है?

धन्यवाद!

: यहाँ [टिप्पणी के लिए पक्ष सवाल इसका कोई खास कारण है, अनदेखी upper() सूचकांक पर नहीं बल्कि lower() से इस्तेमाल किया है,?]

उत्तर

7

दिलचस्प स्थिति। मैं इससे पहले कभी इसके बारे में सोचना बंद नहीं करूँगा। iexact के लिए UPPER के उपयोग की तरह लगता है कि revision 8536 में ticket 3575 के जवाब में, लगभग तीन साल पहले की खोजों को वापस पेश किया गया था। इससे पहले कि Django इस प्रकार की खोजों के लिए ILIKE का उपयोग कर रहा था।

मैं बैकएंड कोड के माध्यम से देखा और केवल एक चीज मैं पा सकते हैं UPPER बनाम LOWER के लिए किसी भी कारण के लिए अंक कि Oracle चूक केस-संवेदी डेटा के अपने इलाज में अपरकेस में हो रहा है कि। चूंकि अन्य अज्ञेयवादी हैं, ऐसा लगता है कि Django ने सभी अड्डों को कवर करने के लिए UPPER पर डिफ़ॉल्ट करने का निर्णय लिया।

स्रोत कोड को देखने से मुझे मिली दूसरी छाप यह थी कि आप UPPER का उपयोग करने के लिए नहीं जा रहे हैं। यह सचमुच पूरे स्थान पर है और न केवल डेटाबेस से पूछताछ करते समय। पायथन का upper स्ट्रिंग एक्सटेंशन का उपयोग अक्सर भी किया जाता है।

मैं कहूंगा कि आपकी सबसे अच्छी शर्त है कि upper(column) के साथ-साथ इसके बजाय एक सूचकांक बनाने के लिए और एक पेय लें।

+0

के लिए जा रहा क्रिस से पहले .extra() प्रयास करें, आपका जवाब के लिए धन्यवाद! मैं उन टिकटों में भी आया, लेकिन इस पर कोई बड़ी चर्चा नहीं हुई कि यह अचानक क्यों 'ऊपरी() 'में बदल गया। ओरेकल बिट के बारे में आपकी अंतर्दृष्टि सबसे ज्यादा मैंने सुना है। यह एक साधारण सवाल है, वास्तव में, इसलिए मुझे लगता है कि मैं सिर्फ '.raw() 'का उपयोग करूंगा। बहुत बहुत धन्यवाद! –

3

.raw()

MyModel.objects.extra(where=["lower(mycol)=%s"], params=['foo']) 
संबंधित मुद्दे

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