2010-09-05 30 views
8

J'utilise sqlalchemy comme mon orm, et j'utilise declarative comme base.Comment obtenir la valeur d'origine des champs modifiés?

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

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

Ma question est, comment puis-je savoir qu'un utilisateur a été modifié, et comment obtenir à nouveau les valeurs d'origine sans base de données de recherche?

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? 

Merci d'avance!


MISE À JOUR

J'ai trouvé une méthode get_history peut obtenir la valeur de l'histoire d'un champ, mais je ne suis pas sûr si elle est la bonne méthode pour mon but.

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']) 

Ainsi, nous pouvons vérifier la valeur de get_history, mais est-ce la meilleure méthode?

+0

Je pense que 'get_history' est la méthode correcte. C'est une fonction publique documentée. – aaronasterling

Répondre

8

\ Pour voir si user a été modifié, vous pouvez vérifier si user in session.dirty. S'il est et que vous voulez défaire, vous pouvez exécuter

session.rollback() 

mais sachez que cela rollback tout pour la session à la dernière session.commit().

Si vous voulez obtenir les valeurs d'origine et la mémoire me sert correctement, c'est le deuxième élément du tuple retourné par la fonction utilitaire sqlalchemy.orm.attributes.get_history. Vous devez faire

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

pour chaque attribut que vous souhaitez.

+0

Merci, vous savez comment obtenir la valeur d'origine? – Freewind

+0

@Freewind. Désolé j'ai manqué cela dans la réponse quand c'était le point. actualisé. – aaronasterling

+0

encore merci :) Je pense que je peux l'utiliser maintenant. Et, comme j'ai essayé, nous devrions obtenir le troisième élément si l'attribut avait été modifié. S'il vous plaît modifier votre réponse si j'ai raison (juste pour laisser les autres voir la bonne réponse) – Freewind