2010-09-05 4 views
8

Ich verwende Sqlalchemy als meine Orm, und declarative als Base verwenden.Wie erhalte ich den ursprünglichen Wert der geänderten Felder?

Base = declarative_base() 
class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 

Meine Frage ist, wie kann ich weiß ein Benutzer geändert wurde, und wie man wieder die ursprünglichen Werte ohne Abfrage Datenbank zu bekommen?

user = Session.query(User).filter_by(id=user_id).first() 
# some operations on user 
.... 
# how do I know if the user.name has been changed or not? 
... 
# How do get the original name? 

Vielen Dank im Voraus!


UPDATE

fand ich eine Methode get_history kann die Geschichte Wert eines Feldes, aber ich bin mir nicht sicher, ob es die richtige Methode für meine Zwecke ist.

from sqlalchemy.orm.attributes import get_history 
user = Session.query(User).first() 
print user.name # 'Jack' 
print get_history(user, 'name') # ((),['Jack'],()) 

user.name = 'Mike' 
print get_history(user, 'name') # (['Mike'],(),['Jack']) 

So können wir den Wert von get_history, überprüfen aber es ist die beste Methode?

+0

Ich denke 'get_history' ist die richtige Methode. Es ist eine dokumentierte öffentliche Funktion. – aaronasterling

Antwort

8

\ Um zu sehen, ob user geändert wurde, können Sie überprüfen, ob user in session.dirty. Wenn es ist, und wollen Sie es rückgängig zu machen, können Sie

session.rollback() 

ausführen, aber darauf hingewiesen werden, dass dies alles für die Sitzung zum letzten session.commit() Rollback wird.

Wenn Sie die ursprünglichen Werte erhalten möchten und Speicher mir richtig dient, ist es das zweite Element des Tupel, das von der sqlalchemy.orm.attributes.get_history-Dienstprogrammfunktion zurückgegeben wird. Sie müssten

old_value = sqlalchemy.orm.attributes.get_history(user, 'attribute')[2] 

für jedes Attribut, das Sie möchten.

+0

Vielen Dank, wissen Sie, wie Sie den ursprünglichen Wert erhalten? – Freewind

+0

@Freewind. Tut mir leid, ich habe das in der Antwort verpasst, als das der Punkt war. aktualisiert. – aaronasterling

+0

danke nochmal :) Ich denke ich kann es jetzt benutzen. Und, wie ich es versuchte, sollten wir das dritte Element erhalten, wenn das Attribut geändert wurde. Bitte editiere deine Antwort wenn ich recht habe (nur um anderen die richtige Antwort zu zeigen) – Freewind