2011-12-07 6 views
5

¿Hay alguna forma de devolver el resultado del diccionario de la consulta adbapi a MySQL?Twisted MySQL adbapi return dictionary

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

Predeterminado returns tuple.

['Bob', '9123 4567'] 

Para sencilla Python & MySQL podemos utilizar MySQLdb.cursors.DictCursor. Pero la forma de utilizarlo con adbapi trenzado


UPD: lo resolví, pero creo que debe haber una mejor manera. Mi solución: simplemente anule el * _runInteraction * método de adbapi.ConnectionPool clase.

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 

Respuesta

9

Puede dirigir MySQLdb utilizar DictCursor pasándolo como el valor para el argumento cursorclass a la función connect. ConnectionPool permite pasar argumentos arbitrarios a través del método de conexión:

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

Cuando se ejecuta una consulta, se obtendrá un dict atrás en lugar de una tupla, por ejemplo runQuery("SELECT 1") produce un resultado de ({'1': 1L},)

+2

Hoy en día Necesito importar MySQLdb.cursors para ejecutar este código. –