session.execute nunca ha devuelto un dict, devuelve un objeto RowProxy, que puede ser indexado como un dict ya sea utilizando las teclas de números enteros para la búsqueda posicional, claves de cadena para la etiqueta basan búsqueda arriba o columna objetos para buscar el valor de esa columna. El problema aquí es que session.execute(query)
no hace lo que parece esperar que haga. Convierte el objeto Query a una instrucción Select, lo ejecuta y devuelve el resultado directamente. El conjunto de resultados no sabe nada sobre las características del nivel de 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 lo antepone a la etiqueta. Entonces, cuando anteriormente row['id']
funcionó, ahora funciona row['users_id']
. En ambos casos funciona row[User.__table__.columns['id']]
.
Para ejecutar consultas ORM, debe utilizar los métodos .all()
, .first()
y .one()
o repetirlos o utilizar la indexación numérica. Las consultas devuelven el nombre de objetos de tupla. Zip la tupla con sus llaves 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
Sólo por curiosidad: ¿Por qué no haces 'session.query (Usuario) .get (id)' (suponiendo User.id es la clave primaria) . O 'session.query (User) .filter (User.id == id) .filter (User.username == username) .first()' if id no es una clave primaria. Haga eso y obtendrá una instancia de Usuario y podrá acceder a los valores de campo por búsqueda de atributos. – codeape