2010-09-05 39 views
8

Benim orm olarak sqlalchemy kullanıyorum ve Base olarak declarative kullanın.Değişen alanların orijinal değeri nasıl alınır?

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

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

sorum nasıl bir kullanıcı değiştirildi biliyoruz ve nasıl tekrar sorgu veritabanı olmadan orijinal değerleri almak için mi?

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? 

Şimdiden teşekkürler!


GÜNCELLEME Ben bir alanın tarihi değeri elde edebilirsiniz bir yöntem get_history buldum, ama benim amaç için doğru yöntem olup olmadığından emin değilim.

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

Yani, biz get_history değerini kontrol edebilirsiniz, ama en iyi yöntem nedir?

+0

Sanırım 'get_history' doğru yöntemdir. Bu belgelenmiş bir kamu işlevi. – aaronasterling

cevap

8

\ user'un değiştirilmiş olup olmadığını görmek için user in session.dirty olup olmadığını kontrol edebilirsiniz. ne olduğunu ve bunu geri almak istiyorsanız,

session.rollback() 

yürütebileceği ama bu son session.commit() için oturumu için her şeyi geri alma olacak hatırlatırız.

Özgün değerleri ve belleği almak istediğinizde bana doğru hizmet veriyorsa, sqlalchemy.orm.attributes.get_history yardımcı programı işlevi tarafından döndürülen tuple'ın ikinci öğesidir. İstediğiniz her özellik için

yapmalısınız.

+0

Teşekkürler, orijinal değeri nasıl alacağınızı biliyor musunuz? – Freewind

+0

@ Yenile. Üzgünüm cevapta bu noktaya geldiğinde cevapsız. güncellenmiş. – aaronasterling

+0

Teşekkürler tekrar ediyorum :) Şimdi kullanabilirim. Ve denediğim gibi, öznitelik değiştirildiyse üçüncü öğeyi almalıyız. Cevabınızı düzeltin (eğer başkalarının doğru cevabı görmesine izin veriyorum) – Freewind