Как получить исходное значение измененных полей?

Я использую sqlalchemy в качестве формы и использую declarative в качестве базы.

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

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

Мой вопрос: как я узнаю, что пользователь был изменен, и как снова получить исходные значения без запроса базы данных?

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?

Заранее спасибо!


ОБНОВЛЕНИЕ

Я обнаружил, что метод get_history может получить значение истории поля, но я не уверен, что это правильный метод для моей цели.

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

Итак, мы можем проверить значение get_history, но лучший ли это способ?


person Freewind    schedule 05.09.2010    source источник
comment
Я думаю, что get_history правильный метод. Это задокументированная публичная функция.   -  person aaronasterling    schedule 05.09.2010


Ответы (1)


\Чтобы узнать, был ли изменен user, вы можете проверить, был ли user in session.dirty. Если это так, и вы хотите отменить это, вы можете выполнить

session.rollback()

но имейте в виду, что это приведет к откату всего сеанса до последнего session.commit().

Если вы хотите получить исходные значения и память мне не изменяет, это второй элемент кортежа, возвращаемый служебной функцией sqlalchemy.orm.attributes.get_history. Вы должны были бы сделать

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

для каждого атрибута, который вы хотите.

person aaronasterling    schedule 05.09.2010
comment
Спасибо, вы знаете, как получить исходное значение? - person Freewind; 05.09.2010
comment
@Фривинд. Извините, я пропустил это в ответе, когда это было важно. обновлено. - person aaronasterling; 05.09.2010
comment
еще раз спасибо :) я думаю, что я могу использовать его сейчас. И, как я пытался, мы должны получить третий элемент, если атрибут был изменен. Пожалуйста, отредактируйте свой ответ, если я прав (просто чтобы другие увидели правильный ответ) - person Freewind; 05.09.2010