[Python] SQLAlchemy restituisce tupla non dizionario


Answers

session.execute non ha mai restituito un dict, restituisce un oggetto RowProxy, che può essere indicizzato come un dict utilizzando le chiavi integer per la ricerca posizionale, le chiavi stringa per la ricerca basata sull'etichetta o gli oggetti Column per cercare il valore di tale colonna. Il problema qui è che session.execute(query) non fa quello che ti aspetti che faccia. Converte l'oggetto Query in un'istruzione Select, lo esegue e restituisce direttamente il risultato. Il set di risultati non sa nulla delle funzionalità a livello di ORM. Ciò che è cambiato tra 0,5 e 0,6 è che ORM utilizza un algoritmo diverso per etichettare le colonne nelle query, quindi antepone il nome della tabella all'etichetta. Quindi, quando in precedenza la row['id'] funzionava, ora la row['users_id'] funziona. In entrambi i casi la row[User.__table__.columns['id']] funziona.

Per eseguire le query ORM dovresti effettivamente utilizzare i metodi .one() e .one() o scorrere su di esso o utilizzare l'indicizzazione numerica. La query restituisce oggetti tupla denominati. Chiudi la tupla con le sue chiavi se vuoi un titolo:

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
Question

Ho aggiornato SQLAlchemy a 0.6 ma ha rotto tutto. Ho notato che restituisce tuple non più un dizionario. Ecco una query di esempio:

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

Questo pezzo di codice usato per restituire un dizionario in 0.5.

La mia domanda è come posso restituire un dizionario?