SQLAlchemy devuelve tuple no diccionario

He actualizado SQLAlchemy a 0.6 pero rompió todo. He notado que devuelve tuple ya no un diccionario. Aquí hay una consulta de muestra:

query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1) result = session.execute(query).fetchone() 

Este código utilizado para devolver un diccionario en 0.5.

Mi pregunta es ¿cómo puedo devolver un diccionario?

Esto debería funcionar: dict(zip(['id','username','email'],result)) (o podrías usar un diccionario de comprensión si estás en Python 3.x).
Además, no es necesario llamar a session.execute en un objeto session.query . Querrás usar el método .one() en su lugar. Esto también evita la necesidad de que la .limit(1) fuera del final de su consulta.

session.execute nunca ha devuelto un dict, devuelve un objeto RowProxy, que se puede indexar como un dict utilizando teclas de enteros para búsqueda posicional, claves de cadena para búsqueda basada en tags o objetos de columna para buscar el valor de esa columna. El problema aquí es que session.execute(query) no hace lo que parece que espera que haga. Convierte el objeto de consulta en una instrucción Select, lo ejecuta y devuelve el resultado directamente. El conjunto de resultados no sabe nada acerca de las características de nivel ORM. Lo que cambió entre 0.5 y 0.6 es que ORM usa un algoritmo diferente para etiquetar las columnas en las consultas, ahora antepone el nombre de la tabla a la etiqueta. Entonces, cuando la row['id'] funcionaba, ahora la row['users_id'] funciona. En ambos casos, la row[User.__table__.columns['id']] funciona.

Para ejecutar consultas ORM, debe utilizar los métodos .one() y .one() o iterar sobre él o usar la indexación numérica. Consulta devuelve objetos de tupla con nombre. Zip la tupla con sus claves si quieres un dict:

 row = session.query(User.id, User.username, User.email)\ .filter(and_(User.id == id, User.username == username)).first() print("id=%s username=%s email=%s" % row) # positional print(row.id, row.username) # by label print(dict(zip(row.keys(), row))) # as a dict 

¿Está seguro de que no es un ResultProxy que pretende ser una tupla cuando lo imprime? Muchos objetos en el ORM no son lo que devuelve su función __str__ .