That sounds like it could be very useful for me, thank you for pointing me there. That could solve one of the two issues I'm facing that I listed... what about the other?
On Apr 29, 11:02 am, "Michael Bayer" <mike...@zzzcomputing.com> wrote: > Kent wrote: > > Before saving objects to the database, we have need to inspect the > > changes. I am aware of the attributes.get_history() functionality, > > which is helpful to a point. > > > attributes.get_history() falls short of what I need in two places: > > *** after a session.flush(), it is gone. There are times we need to > > flush, but the transaction has still not been committed, and more > > processing is required, so we still need access to the history of > > changes for this object in this transaction despite a call to flush(). > > *** if there are calculation methods I've written that objects have, I > > need to be able to call these for the "old" object. For example, say > > I write a method on Order class such as "def > > calculate_total_volume(self):" When an order is saved I need to > > compare the old volume to the new. On the merged order, I can call > > "merged_obj.calculate_total_volume()", but I would need to use the > > information in attributes.get_history() to *recreate* the "old" > > version of the object in order to call > > "old_order.calculate_total_volume()" > > > I've realized that if merge() attached a python attribute, such as > > "_original" (which is a transient clone of the object fetched from the > > database) to each object as it merges it, then this > > * would be accessible regardless of session.flush() > > * could be acted on with object methods like any other object > > * is probably more intuitive than "attributes.get_history()", > > especially to those familiar with Oracle triggers and :OLD.orderid > > vs :NEW.orderid. This would be very similar: "merged.orderid" vs > > "merged._original.orderid" > > > Disadvantage: > > * it goes against the concept of trying to be very hands-off on the > > actual object. Maybe it could instead be stored in the instance's > > state or something. > > > Does this conceptually make sense? Does it make enough sense to make > > this a feature? > > > In the meantime, can you recommend an approach for me? (Extend the > > Session class?) > > you want to be using a SessionExtension here, and the "after_flush()" hook > is provided precisely for the use case that you want rules to execute > after SQL has been flushed, but you still want a full accounting of > everything that has changed - the attribute history on all objects has not > yet been reset at this point. The information available in after_flush() > is unique in that it also includes any foreign key values that have been > synchronized from parent to child over relationships. > > > > > Thanks much, > > Kent > > > -- > > You received this message because you are subscribed to the Google Groups > > "sqlalchemy" group. > > To post to this group, send email to sqlalch...@googlegroups.com. > > To unsubscribe from this group, send email to > > sqlalchemy+unsubscr...@googlegroups.com. > > For more options, visit this group at > >http://groups.google.com/group/sqlalchemy?hl=en. > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group > athttp://groups.google.com/group/sqlalchemy?hl=en. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.