2010-04-20 17 views
5

क्या Django में बैकएंड-तटस्थ शब्दकोश कर्सर प्राप्त करने का कोई तरीका है? यह एक कर्सर होगा जो एक टुपल की बजाए एक नियम है। मुझे उस स्कूल प्रोजेक्ट के लिए ओरेकल का उपयोग करने के लिए मजबूर होना पड़ रहा है जिस पर मैं काम कर रहा हूं।Django बैकएंड-तटस्थ DictCursor

पायथन के MySQLDb मॉड्यूल में इसे डिक्टर्ससर कहा जाता है।

WoLpH की प्रेरणादायक सुझाव के साथ

मैं जानता हूँ कि मैं बहुत करीब हूं ..

def dict_cursor(cursor): 
    for row in cursor: 
     yield dict(zip(cursor.description, row)) 

पुनरावृत्ति और प्रत्येक पंक्ति में परिणाम के लिए इस्तेमाल किया कर्सर मुद्रण:

(482072, 602592, 1) 
(656680, 820855, 2) 
(574968, 718712, 4) 
(557532, 696918, 3)) 

लेकिन dict_cursor साथ मैं:

{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 482072, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 1, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 602592} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 656680, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 2, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 820855} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 574968, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 4, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 718712} 
{('NET_SPENT', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 557532, ('LOT', <type 'cx_Oracle.NUMBER'>, 12, 22, 11, 0, 0): 3, ('NET_COLLECTED', <type 'cx_Oracle.NUMBER'>, 127, 22, 0, 0, 1): 696918} 

मैं केवल इसे कुंजी का उपयोग करना चाहता हूं, उदाहरण के लिए 'नेट स्पेन्ट'।

{'NET_COLLECTED': 602592, 'NET_SPENT': 482072, 'LOT': 1} 
{'NET_COLLECTED': 820855, 'NET_SPENT': 656680, 'LOT': 2} 
{'NET_COLLECTED': 718712, 'NET_SPENT': 574968, 'LOT': 4} 
{'NET_COLLECTED': 696918, 'NET_SPENT': 557532, 'LOT': 3} 
+0

मैंने अपने कर्सर को संशोधित किया है, मैंने वर्णन वस्तु को गलत समझा है :) – Wolph

उत्तर

6

आप लाइनों :)

def dict_cursor(cursor): 
    description = [x[0] for x in cursor.description] 
    for row in cursor: 
     yield dict(zip(description, row)) 

या के एक जोड़े में यह लिख सकता है -

def dict_cursor(cursor): 
    for row in cursor: 
     out = {} 
     for i,col in enumerate(cursor.description): 
      out[col[0]] = row[i] 
     yield out 

:

यह थोड़ा और अधिक परिष्कृत करने के बाद, यह काम करने लगता है यदि आप वास्तव में अंतरिक्ष को सहेजना चाहते हैं:

simplify_description = lambda cursor: [x[0] for x in cursor.description] 
dict_cursor = lambda c, d: dict(zip(d, r) for r in c)) 
+2

वह एक-लाइनर बी/सी काम नहीं करेगा, आपने अपना उपज स्टेटमेंट खो दिया है, और मुझे नहीं लगता कि आप कैसे पैदा कर सकते हैं उपज के बाद से एक पंक्ति सूची का हिस्सा नहीं हो सकती .. –

+2

आप पूरी तरह से सही हैं, मैंने इसे संशोधित किया है :) – Wolph

+1

कॉलम के साथ ऐसा करने पर दिनांक की तरह यह कुछ समय देता है जैसे datetime.date (2010,10,21) एक वास्तविक दिनांक वस्तु वापस करने के बजाय। मैं अपने ब्राउज़र में JSON के रूप में कस्टम एसक्यूएल परिणाम सेट वापस करने की कोशिश कर रहा हूं। – mikec