2010-09-05 2 views
8

Я использую sqlalchemy в качестве своего орма и использую declarative как Base.Как получить исходное значение измененных полей?

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? 

Заранее благодарен!


UPDATE

Я нашел метод 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, но это лучший способ?

+0

Я думаю, что 'get_history' - правильный метод. Это зарегистрированная публичная функция. – aaronasterling

ответ

8

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

session.rollback() 

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

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

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

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

+0

Спасибо, знаете ли вы, как получить первоначальное значение? – Freewind

+0

@Freewind. Извините, я пропустил это в ответ, когда это было важно. обновлено. – aaronasterling

+0

еще раз спасибо :) Я думаю, что смогу использовать его сейчас. И, как я и пытался, мы должны получить третий элемент, если атрибут был изменен. Пожалуйста, отредактируйте свой ответ, если я прав (просто чтобы другие увидели правильный ответ) – Freewind