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, [email protected] <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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.