2012-06-04 3 views
12

Um einen Cursor in django ich tun bekommen:Mit dict_cursor in django

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

Wie würde ich einen dict Cursor in django erhalten, das entspricht -

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

Gibt es eine Möglichkeit zu tun das im Django? Als ich versuchte cursor = connection.cursor(MySQLdb.cursors.DictCursor) Ich bekam eine Exception Value: cursor() takes exactly 1 argument (2 given). Oder muss ich direkt mit dem Python-Mysql-Treiber verbinden?

Die django docs dictfetchall schlagen vor, mit:

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() 
    ] 

Gibt es einen Unterschied in der Leistung dieser zwischen der Verwendung und eine dict_cursor zu schaffen?

Antwort

22

Nein, es gibt keine solche Unterstützung für DictCursor in Django. Aber Sie können für Sie eine kleine Funktion schreiben, dass, sehen diese 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

Der folgende Code wandelt das Ergebnis in ein Wörterbuch festgelegt.

Wenn die Ergebnismenge mehrere Zeilen hat, iterieren Sie stattdessen über den Cursor.

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

nur eine interessante Seite ähnlich (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') 

Offensichtlich fühlen sich frei, hat zu verwenden Hinweis. Ausdruck (x.name für x in cursor.description) erzeugt einen Generator und kein Listenobjekt. Ein solcher Generator wird nach der ersten Iteration der Schleife "for row in cursor" erschöpft sein. Um dieses Codebeispiel für mehrere Zeilen zu verwenden, müssen Spalten vorab abgerufen werden, indem Sie runde Klammern in eckige Klammern ändern: [x.name für x in cursor.description] –

1

leicht mit Postgres zumindest getan, ich bin sicher, dass mysql DictCursor, RealDictCursor, LoggingCursor etc