Hmm, I don't think I could listen to the attribute event; it's saying that the AssociationProxy doesn't have "dispatch".
Also, suppose I could detect the orphan-deletes earlier, what's the best way to suppress the objects marked as dirty? Here's my version of your code if it helps: https://github.com/canaryhealth/sqlalchemy_audit/blob/master/sqlalchemy_audit/history_meta.py Your help is much appreciated! Thanks very much. On Wednesday, April 29, 2015 at 1:00:14 PM UTC-4, Michael Bayer wrote: > > > > On 4/29/15 12:11 PM, st...@canary.md <javascript:> wrote: > > Since my association object doesn't have extra columns, the row ('bob, > 'apple') will be deleted. However, if there are extra columns, then having > it marked as "dirty" is desired. > > Perhaps I would delay my recording of my audit rows until after orphans > are resolved. I am already using "after_flush", is there another event I > could use? Otherwise, I would need to detect an object as an association > object without extra columns and perform specific logic to handle this. Is > there a way to identify association objects? > > there's not an event in between the time that the orphan thing is > calculated and the SQL is emitted. After flush is a candidate if you can > make that work. > > The approach using the event is just to make an event listener for this > purpose and apply it to those classes that need it: > > > class MyParent(Base): > # ... > > associations = relationship("MyAssociation", cascade="all, > delete-orphan") > > @event.listens_for(MyParent.associations, "remove") > def on_remove(obj, child, initiator): > object_session(obj).delete(child) > > > class MyAssociation(Base): > # ... > > > > > > > Thanks! > > > On Tuesday, April 28, 2015 at 7:53:21 PM UTC-4, Michael Bayer wrote: >> >> >> >> On 4/28/15 6:57 PM, st...@canary.md wrote: >> >> Hi, >> >> Background information: I am trying to implement functionality similar >> to the history_meta.py example ( >> <http://docs.sqlalchemy.org/en/rel_0_9/_modules/examples/versioned_history/history_meta.html> >> http://docs.sqlalchemy.org/en/rel_0_9/_modules/examples/versioned_history/history_meta.html). >> >> I am listening for after_flush events and create an audit record and am >> having problems with association objects. Here is an example: >> >> class User(Auditable, self.Base, ComparableEntity): >> __tablename__ = 'usertable' >> id = Column(Integer, primary_key=True) >> name = Column(String) >> keywords = association_proxy('assocs', 'keyword') >> >> class Keyword(Auditable, self.Base, ComparableEntity): >> __tablename__ = 'keywordtable' >> id = Column(Integer, primary_key=True) >> word = Column(String) >> >> class UserKeyword(Auditable, self.Base, ComparableEntity): >> __tablename__ = 'userkeywordtable' >> user_id = Column(Integer, ForeignKey("usertable.id"), >> primary_key=True) >> keyword_id = Column(Integer, ForeignKey("keywordtable.id"), >> primary_key=True) >> user = relationship(User, >> backref=backref("assocs", >> cascade="all, >> delete-orphan")) >> keyword = relationship(Keyword) >> def __init__(self, keyword=None, user=None): >> self.user = user >> self.keyword = keyword >> >> >> apple = Keyword(word='apple') >> pear = Keyword(word='pear') >> bob = User(name='bob') >> bob.keywords = [apple, pear] >> sess.add(bob) >> sess.commit() >> >> bob.keywords.remove(apple) <====== this is when my question >> is about >> sess.commit() >> >> When we remove the keyword, it marks the UserKeyword association object >> is "dirty" instead of "deleted". Why is that? Since the row is being >> removed, I would expect it to be marked as "deleted", so that I could make >> an audit record indicating it was deleted. >> >> >> does the row actually get deleted? the calculation of "orphan" isn't >> done until flush time, because theoretically you could be associating the >> UserKeyword to another User. >> >> it doesn't look like the versioned rows recipe has support for this use >> case right now. You could force the up-front delete using a "remove" >> attribute event on that collection. >> >> >> -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.