2010-09-05 8 views
8

Estoy usando sqlalchemy como mi orm, y uso declarative como Base.¿Cómo obtener el valor original de los campos modificados?

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

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

Mi pregunta es, ¿cómo sé que un usuario ha sido modificado, y cómo obtener los valores originales sin base de datos de consulta de nuevo?

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? 

¡Gracias de antemano!


ACTUALIZACIÓN

He encontrado un método get_history puede obtener el valor de la historia de un campo, pero no estoy seguro de si es el método correcto para mi propósito.

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

Así, podemos comprobar el valor de get_history, pero ¿es el mejor método?

+0

Creo que 'get_history' es el método correcto. Es una función pública documentada. – aaronasterling

Respuesta

8

\ Para ver si user se ha modificado, puede verificar si user in session.dirty. Si se trata y que desea deshacer, puede ejecutar

session.rollback() 

pero le informará de que esto va a deshacer todo para la sesión de la última session.commit().

Si desea obtener los valores originales y la memoria me sirve correctamente, es el segundo elemento de la tupla devuelta por la función de utilidad sqlalchemy.orm.attributes.get_history. Usted tendría que hacer

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

para cada atributo que desea.

+0

Gracias, ¿sabes cómo obtener el valor original? – Freewind

+0

@Freewind. Lamento haberme perdido eso en la respuesta cuando ese era el punto. actualizado. – aaronasterling

+0

gracias de nuevo :) Creo que puedo usarlo ahora. Y, como lo intenté, deberíamos obtener el tercer elemento si el atributo se había modificado. Por favor edite su respuesta si estoy en lo cierto (solo para que otros vean la respuesta correcta) – Freewind

Cuestiones relacionadas