2015-04-28 17 views
9

Bazı eylemleri SQLAlchemy-Modelleri ile ne yapacağını günlüğe kaydetmek istiyorum. YaniSQLAlchemy'de izleme modeli değişiklikleri

, bir after_insert, after_delete ve before_update ben Modelin önceki ve şimdiki temsilini kurtaracak kancaları,

def keep_logs(cls): 
    @event.listens_for(cls, 'after_delete') 
    def after_delete_trigger(mapper, connection, target): 
     pass 

    @event.listens_for(cls, 'after_insert') 
    def after_insert_trigger(mapper, connection, target): 
     pass 

    @event.listens_for(cls, 'before_update') 
    def before_update_trigger(mapper, connection, target): 
     prev = cls.query.filter_by(id=target.id).one() 
     # comparing previous and current model 


MODELS_TO_LOGGING = (
    User, 
) 
for cls in MODELS_TO_LOGGING: 
    keep_logs(cls) 

var Ama bir sorun var: Ben before_update modeli bulmaya çalışıyorum ne zaman kanca, SQLA değiştirilmiş (kirli) sürümü döndürür. Güncellemeden önce modelin önceki sürümünü nasıl alabilirim? Model değişikliklerini korumanın farklı bir yolu var mı?

Teşekkürler!

cevap

9

SQLAlchemy, değişiklikleri her bir özelliğe göre izler. Etkinlikte olayı tekrar sorgulamanıza (ve yapmamasına) gerek yoktur. Ayrıca, bu değişiklik herhangi bir veriyi değiştirmeyecek olsa bile, değiştirilen herhangi bir durum için olay tetiklenir. Her sütunun üzerine gelin, değiştirilmiş olup olmadığını kontrol edin ve yeni değerleri saklayın.

@event.listens_for(cls, 'before_update') 
def before_udpate(mapper, connection, target): 
    state = db.inspect(target) 
    changes = {} 

    for attr in state.attrs: 
     hist = state.get_history(attr.key, True) 

     if not hist.has_changes(): 
      continue 

     # hist.deleted holds old value 
     # hist.added holds new value 
     changes[attr.key] = hist.added 

    # now changes map keys to new values