2015-11-03 4 views
9

Ich benutze PyMySQL schon seit einer Weile und habe meinen eigenen Wrapper erstellt, den ich gewohnt bin, Abfragen zu schreiben. Nichtsdestoweniger habe ich CSV-Dateien mit OrderedDict erstellt, weil ich die Reihenfolge beibehalten muss, aber mir ist klar, dass wenn ich PyMySQL für die Abfrage der Datenbank verwende, ich nicht die Reihenfolge bekomme, die die Datenbank zurückgibt. Das ist ein bisschen nervig, wenn CSV-Dateien überprüft werden sollen, wenn ich nur Dinge dumpen wollte, anstatt die Befehle manuell zu schreiben.PyMySQL und OrderedDict

Meine Frage ist, wie verwende ich PyMySQL mit OrderedDict? Derzeit ist mein Code ist wie folgt:

import pymysql 
conn = pymysql.connect(host='localhost', user='root', passwd='', db='test') 
cursor = conn.cursor(pymysql.cursors.DictCursor) 

Also, wenn ich fragen, werde ich wieder ein Wörterbuch bekommen:

cursor.execute("""SELECT * FROM test""") 
for row in cursor: 
    pp(row) # gives me dictionary 

Was ich will, ist, dass, wenn ich durch Cursor rolle ich eigentlich bin Abrufen ein OrderedDict der Spalten in der Reihenfolge, in der sie aus der Datenbank kommen.

Etwas wie:

cursor = conn.cursor(pymysql.cursors.OrderedDict) 
+0

fügen Sie eine weitere Spalte hinzu mn was enthält, quellen Zeile und Reihenfolge bei der Abfrage? – Busturdust

+0

@Busturdust - Ich könnte in meinem Wrapper eine Funktion sagen sagen "query_ordered" oder etwas, das die Auswahlfelder in einer Liste hat und dann einen Generator für die Ersetzung von Ordereddict anstelle des Wörterbuchs erstellen kann, aber es wenn ich nur an einer Lösung bekommen kann ohne das zu schreiben und das würde auch gut mit meinem Wrapper spielen, würde ich das lieber haben. – DataHerder

Antwort

14

Sie cursors.DictCursorMixin verwenden könnte und ändern ihre dict_type-collections.OrderedDict (die Standardeinstellung ist dict):

from collections import OrderedDict 
from pymysql.cursors import DictCursorMixin, Cursor 

class OrderedDictCursor(DictCursorMixin, Cursor): 
    dict_type = OrderedDict 

Dann können Sie die neue Cursor-Klasse verwenden, wie unten

gezeigt
cursor = conn.cursor(OrderedDictCursor) 
+1

Funktioniert genau wie erwartet. Das habe ich auch in PyMySQLs Github-Repository gesehen. Schnelle Antwort! Vielen Dank! – DataHerder

+0

danke. funktioniert super –

+0

Das ist so verdammt süß! Vielen Dank –