2015-11-03 15 views
9

Utilizzo PyMySQL da un po 'di tempo e ho creato il mio wrapper che sono abituato a scrivere in modo sintetico per le query. Tuttavia ho creato file CSV con OrderedDict perché ho bisogno di mantenere l'ordine lo stesso, ma mi rendo conto che se utilizzo PyMySQL per interrogare il database, non otterrò l'ordine che il database restituisce. Questo è un po 'fastidioso per i file CSV di controllo spot se volevo semplicemente scaricare materiale anziché scrivere gli ordini.PyMySQL e OrderedDict

La mia domanda è, come utilizzo PyMySQL con OrderedDict? Attualmente il mio codice è il seguente:

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

Così ogni volta interrogo, sarò sempre un dizionario posteriore:

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

Quello che voglio è che quando mi rotolo attraverso cursore realtà sto recuperando un OrderedDict delle colonne nell'ordine in cui entrano dal database.

Qualcosa di simile:

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

aggiungi un altro colore mn che detiene, riga sorgente e ordine da quello quando si esegue una query? – Busturdust

+0

@Busturdust - Potrei scrivere nel mio wrapper una funzione dire "query_ordered" o qualcosa che ha i campi selezionati in un elenco e quindi creare un generatore per ottenere ordinamento in sostituzione del dizionario ma se riesco ad ottenere una soluzione senza scriverlo e anche quello con il mio wrapper funzionerebbe bene, preferirei farlo. – DataHerder

risposta

14

Si potrebbe utilizzare cursors.DictCursorMixin e cambiare il suo dict_type-collections.OrderedDict (il valore predefinito è dict):

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

class OrderedDictCursor(DictCursorMixin, Cursor): 
    dict_type = OrderedDict 

quindi è possibile utilizzare la nuova classe cursore come illustrato di seguito

cursor = conn.cursor(OrderedDictCursor) 
+1

funziona esattamente come previsto. L'ho visto nel repository github di PyMySQL. Risposta veloce! Grazie! – DataHerder

+0

grazie. Funziona alla grande –

+0

Questo è dannatamente dolce! Grazie –

Problemi correlati