5 Stimmen

Django Backend-neutraler DictCursor

Gibt es eine Möglichkeit, eine Backend-neutrale Wörterbuch-Cursor in Django zu erhalten? Dies wäre ein Cursor, der ein Diktat und nicht ein Tupel ist. Ich bin gezwungen, Oracle für das Schulprojekt zu verwenden, an dem ich arbeite.

in Pythons MySQLDb-Modul wird es DictCursor genannt.

Mit WoLpHs inspirierendem Vorschlag weiß ich, dass ich sehr nahe dran bin

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

Das Iterieren und Ausdrucken jedes Zeilencursors hatte früher zur Folge, dass:

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

Aber mit dict_cursor erhalte ich:

{('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}

Ich möchte nur den Schlüssel verwenden, z. B. "NET SPENT".

Nach einer weiteren Verfeinerung scheint dies zu funktionieren:

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

-

{'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 Stimmen

Ich habe meinen Cursor geändert, ich habe die Beschreibung des Objekts wohl falsch verstanden :)

7voto

Wolph Punkte 73880

Du könntest es in ein paar Zeilen schreiben :)

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

Oder wenn Sie wirklich Platz sparen wollen:

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 Stimmen

Dieser Einzeiler wird nicht funktionieren b/c Sie haben Ihre Yield-Anweisung verloren, und ich sehe nicht, wie Sie Yield in einer Zeile seit Yield kann nicht Teil einer Liste sein.

1 Stimmen

Wenn Sie dies mit Spalten wie Datum tun, gibt es etwas wie datetime.date(2010,10,21) zurück, anstatt ein tatsächliches Datumsobjekt zurückzugeben. Ich versuche, eine benutzerdefinierte SQL-Ergebnismenge als JSON an meinen Browser zurückzugeben.

1 Stimmen

@Mikec: a datetime.date Objekt es ein aktuelles Datumsobjekt. Das Problem ist, dass das json Standard kein Datumsobjekt definiert, müssen Sie es selbst in einen String umwandeln. Das können Sie entweder in der Abfrage tun oder Sie können Ihren Json-Encoder so ändern, dass er es für Sie tut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X