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.

Reply via email to