session.execute hat noch nie ein dict zurückgekehrt, es gibt ein RowProxy Objekt, das wie ein dict entweder ganzzahlige Schlüssel für Positions Lookup indiziert werden können, String-Schlüssel für Label aus Lookup oder Column-Objekte den Wert zum Nachschlagen dieser Spalte. Das Problem hier ist, dass nicht das tut, was Sie zu erwarten scheinen. Es konvertiert das Query-Objekt in eine Select-Anweisung, führt dies aus und gibt das Ergebnis direkt zurück. Das Resultset weiß nichts über ORM-Level-Features. Was zwischen 0.5 und 0.6 geändert wurde, ist, dass ORM einen anderen Algorithmus verwendet, um die Spalten in Abfragen zu beschriften, es fügt nun den Tabellennamen dem Label voran. Also, wenn vorher row['id']
passiert ist, funktioniert jetzt row['users_id']
funktioniert. In beiden Fällen funktioniert row[User.__table__.columns['id']]
.
Um ORM-Abfragen auszuführen, sollten Sie tatsächlich die Methoden .all()
, .first()
und .one()
verwenden oder darüber iterieren oder numerische Indexierung verwenden. Abfrage gibt benannte Tupel-Objekte zurück. Zip das Tupel mit seinen Tasten, wenn Sie einen dict wollen:
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
Einfach nur neugierig: Warum gehst du nicht tun 'session.query (Benutzer) .get (id)' (User.id unter der Annahme ist der Primärschlüssel) . Oder 'session.query (Benutzer) .filter (User.id == id) .filter (User.username == Benutzername) .first()' wenn ID kein Primärschlüssel ist. Tun Sie das und Sie erhalten eine Benutzerinstanz zurück, und Sie können auf die Feldwerte durch Attributsuche zugreifen. – codeape