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? 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 <javascript:> 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). > > 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+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.