Django

2012-06-04 3 views
12

में dict_cursor का उपयोग Django में एक कर्सर मैं क्या पाने के लिए:Django

from django.db import connection 
cursor = connection.cursor() 

मैं Django में एक dict कर्सर कैसे प्राप्त होता है, के बराबर -

import MySQLdb 
connection = (establish connection) 
dict_cursor = connection.cursor(MySQLdb.cursors.DictCursor) 

वहाँ ऐसा करने के लिए एक रास्ता है यह django में? जब मैंने cursor = connection.cursor(MySQLdb.cursors.DictCursor) की कोशिश की तो मुझे Exception Value: cursor() takes exactly 1 argument (2 given) मिला। या मुझे सीधे पाइथन-mysql ड्राइवर से कनेक्ट करने की आवश्यकता है?

Django डॉक्स dictfetchall उपयोग करने का सुझाव:

def dictfetchall(cursor): 
    "Returns all rows from a cursor as a dict" 
    desc = cursor.description 
    return [ 
     dict(zip([col[0] for col in desc], row)) 
     for row in cursor.fetchall() 
    ] 

इस का उपयोग करते हुए और एक dict_cursor बनाने के बीच एक प्रदर्शन अंतर है?

उत्तर

22

डीजेंगो में DictCursor के लिए ऐसा कोई समर्थन नहीं है। लेकिन आप के लिए है कि करने के लिए एक छोटे से समारोह में लिख सकते हैं, इस ticket देखें:

def dictfetchall(cursor): 
    "Returns all rows from a cursor as a dict" 
    desc = cursor.description 
    return [ 
      dict(zip([col[0] for col in desc], row)) 
      for row in cursor.fetchall() 
    ] 

>>> cursor.execute("SELECT id, parent_id from test LIMIT 2"); 
>>> dictfetchall(cursor) 
[{'parent_id': None, 'id': 54360982L}, {'parent_id': None, 'id': 54360880L}] 
0

निम्नलिखित कोड परिणाम एक शब्दकोश में सेट बदल देता है।

from django.db import connections 
cursor = connections['default'].cursor() 

columns = (x.name for x in cursor.description) 
result = cursor.fetchone() 
result = dict(zip(columns, result)) 

यदि परिणाम सेट में कई पंक्तियां हैं, तो कर्सर पर इसके बजाय पुनरावृत्ति करें।

columns = [x.name for x in cursor.description] 
for row in cursor: 
    row = dict(zip(columns, row)) 
+0

बस एक रोचक पक्ष का उपयोग करने के लिए स्वतंत्र महसूस ध्यान दें। अभिव्यक्ति (कर्सर। Xcription में x के लिए x.name) जनरेटर को एक सूची वस्तु नहीं बनाता है। "कर्सर में पंक्ति के लिए" लूप के पहले पुनरावृत्ति के बाद ऐसा जनरेटर समाप्त हो जाएगा। एकाधिक कोडों पर इस कोड का नमूना कार्य करने के लिए हमें स्क्वायर ब्रैकेट में राउंड ब्रैकेट को बदलकर कॉलम को पूर्व-प्राप्त करने की आवश्यकता है: [x.name कर्सर में x के लिए नाम] –

1

आसानी Postgres के साथ किया कम से कम, मुझे यकीन है कि mysql समान है कर रहा हूँ (Django 1,11)

from django.db import connections 
from psycopg2.extras import NamedTupleCursor 


def scan_tables(app): 
    conn = connections['default'] 
    conn.ensure_connection() 
    with conn.connection.cursor(cursor_factory=NamedTupleCursor) as cursor: 
     cursor.execute("SELECT table_name, column_name " 
         "FROM information_schema.columns AS c " 
         "WHERE table_name LIKE '{}_%'".format(app)) 
     columns = cursor.fetchall() 
     for column in columns: 
      print(column.table_name, column.column_name) 


scan_tables('django') 

जाहिर DictCursor, RealDictCursor, LoggingCursor आदि