python - tutorial - SQLAlchemy convierte el resultado de la consulta SELECT a una lista de dictados
sqlalchemy tutorial python (3)
Cuando estaba usando session.query, pude convertir el resultado a una lista de dictados:
my_query = session.query(table1,table2).filter(all_filters)
result_dict = [u.__dict__ for u in my_query.all()]
Pero ahora que tengo que trabajar con la operación SELECT()
, ¿cómo puedo convertir los resultados a un dictado que se parece a cada resultado de la fila?
[{''Row1column1Name'' : ''Row1olumn1Value'', ''Row1column2Name'' :''Row1Column2Value''},{''Row2column1Name'' : ''Row2olumn1Value'', ''Row2column2Name'' : ''Row2Column2Value''},etc....]
.
Este es mi código SELECT ():
select = select([table1,table2]).where(all_filters)
res = conn.execute(select)
row = res.fetchone() #I have to use fetchone() because the query returns lots of rows
resultset=[]
while row is not None:
row = res.fetchone()
resultset.append(row)
print resultset
El resultado es :
[(''value1'', ''value2'', ''value3'', ''value4''),(.....),etc for each row]
Soy nuevo en Python, cualquier ayuda sería apreciada.
Esto parece ser un objeto RowProxy. Tratar:
row = dict(zip(row.keys(), row))
Para la primera consulta es mejor usar este enfoque para sqlalchemy KeyedTuple:
# Convert an instance of `sqlalchemy.util._collections.KeyedTuple`
# to a dictionary
my_query = session.query(table1,table2).filter(all_filters)
result_dict = map(lambda q: q._asdict(), my_query)
O
result_dict = map(lambda obj: dict(zip(obj.keys(), obj)), my_query)
Para ResultProxy como se mencionó anteriormente:
result_dict = dict(zip(row.keys(), row))
Puede encasillar cada fila a partir de un resultado seleccionado como dict o tupla. Lo que has estado viendo es el comportamiento predeterminado, que es representar cada fila como una tupla. Para encasillarlo a un dict, modifique su código de esta manera:
select = select([table1, table2]).where(all_filters)
res = conn.execute(select)
resultset = []
for row in res:
resultset.append(dict(row))
print resultset
Esto funciona bien si necesita procesar el resultado una fila a la vez.
Si está feliz de poner todas las filas en una lista de una sola vez, la comprensión de la lista es un poco más nítida:
select = select([table1, table2]).where(all_filters)
res = conn.execute(select)
resultset = [dict(row) for row in res]
print resultset