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 :)