tutorialspoint tutorial query engine python sqlalchemy

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