No he trabajado anteriormente con psycopg2, pero estoy intentando cambiar la fábrica del cursor a DictCursor para que fetchall o fetchone devuelvan un diccionario en lugar de una lista.DictCursor no parece funcionar en psycopg2
Creé un script de prueba para hacer las cosas más simples y solo compruebo esta funcionalidad. Aquí está mi pequeño pedazo de código que creo que debería trabajar
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=%s user=%s password=%s" % (DATABASE, USERNAME, PASSWORD))
cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
cur.execute("SELECT * from review")
res = cur.fetchall()
print type(res)
print res
La resolución variable es siempre una lista y no un diccionario lo que cabe esperar.
Una solución actual que he implementado es utilizar esta función que crea un diccionario y ejecuta cada fila devuelta por fetchall a través de él.
def build_dict(cursor, row):
x = {}
for key,col in enumerate(cursor.description):
x[col[0]] = row[key]
return d
Python es la versión 2.6.7 y psycopg2 es la versión 2.4.2.
Gracias, creo que estás al tanto con "dict-like". Es una lista pero actúa como un diccionario. Parece una decisión de diseño extraña, pero al menos está funcionando ahora. Gracias de nuevo. – Jim
@Seth: si quieres un diccionario real, utiliza el acertadamente llamado 'RealDictCursor'. –
@Seth: un diccionario no tiene orden por lo que ya no puede usarlo como una tupla, la primera columna en la consulta ya no sería 'row [0]' sino algo arbitrario. Así que hay algunos méritos :) – Wolph