2011-12-07 10 views
5

Czy istnieje sposób na zwrócenie wyniku słownika z zapytania adbapi do MySQL?Słownik zwrotny skróconego MySQL MySQL

[name: 'Bob', phone_number: '9123 4567'] 

Domyślna krotka zwrotu.

['Bob', '9123 4567'] 

Do prostego Python & MySQL możemy użyć MySQLdb.cursors.DictCursor. Ale jak go używać z skręconych adbapi


UPD: Rozwiązałem go, ale myślę, że nie powinno być lepszy sposób. Moje rozwiązanie: wystarczy zastąpić metodę * _runInteraction * klasy adbapi.ConnectionPool.

class MyAdbapiConnectionPool(adbapi.ConnectionPool): 
def _runInteraction(self, interaction, *args, **kw): 
    conn = self.connectionFactory(self) 
    trans = self.transactionFactory(self, conn) 
    try: 
     result = interaction(trans, *args, **kw) 
     if(result and isinstance(result[0], (list, tuple))): 
      colnames = [c[0] for c in trans._cursor.description] 
      result = [dict(zip(colnames, item)) for item in result]   
     trans.close() 
     conn.commit() 
     return result 
    except: 
     excType, excValue, excTraceback = sys.exc_info() 
     try: 
      conn.rollback() 
     except: 
      log.err(None, 'Rollback failed') 
     raise excType, excValue, excTraceback 

Odpowiedz

9

można kierować MySQLdb używać DictCursor przepuszczając ją jako wartość dla cursorclass argument funkcji connect. ConnectionPool pozwala przechodzić przez dowolne argumenty do metody connect:

import MySQLdb 
pool = ConnectionPool("MySQLdb", ..., cursorclass=MySQLdb.cursors.DictCursor) 
... 

Po uruchomieniu kwerendy, dostaniesz dict powrotem zamiast krotki, np runQuery("SELECT 1") produkuje wyniku ({'1': 1L},)

+2

Obecnie mamy trzeba wykonać import MySQLdb.cursors, aby wykonać ten kod. –

Powiązane problemy