you could also implement a custom list class that *does* track itself with items that are added/removed from it, and then implement a delete (instance) method that removes the instance from all the lists its contained within before doing a session.delete(). i might consider adding an extension module for this since its not very hard to implement.
On Oct 27, 2006, at 10:12 AM, Hogarty, David A. wrote: > > Thanks, I got it working. For future reference, if you have a > polymorphic relationship, in order to avoid this kind of phantom > object, > you need to manually delete from both the parent collection and the > child collection, e.g. > > Project (Has Many)-> Node > Parameter (Subclass)-> Node > > to remove a parameter from a project, you need to do both > > project.parameters.remove(param) > project.nodes.remove(param) > > -Dave > > -----Original Message----- > From: sqlalchemy@googlegroups.com [mailto:[EMAIL PROTECTED] > On Behalf Of Michael Bayer > Sent: Thursday, October 26, 2006 5:43 PM > To: sqlalchemy@googlegroups.com > Subject: [sqlalchemy] Re: related object list not being updated on > delete > > > items dont get removed from collections when they are marked with > delete(). with the exception of bi-directional relationships, SA > doesnt add or remove items from collections. to do so in this case > would require tracking every collection which a particular item is > contained within which would add both memory and performance overhead. > > the usual strategy is to mark the relationship with a "delete-orphan" > cascade, and then just remove the item from the collection, which > will result in its getting deleted during the flush() operation. > > On Oct 26, 2006, at 5:13 PM, Hogarty, David A. wrote: > >> >> I'm having a problem where phantom child objects stay attached to a >> parent object after having been deleted. For example: >> >> def test_add_delete_parameter(self): >> p = Project(name='ptest') >> db.session.save(p) >> db.session.flush() >> p.parameters.append(Parameter(name='p1')) >> p.parameters.append(Parameter(name='p2')) >> p.parameters.append(Parameter(name='p3')) >> db.session.flush() >> id = p.parameters[-1].id >> param = db.session.query(Parameter).get_by( >> and_( >> Parameter.c.project_id == p.id, >> Parameter.c.id == id >> )) >> db.session.delete(param) >> db.session.flush() >> p2 = db.session.query(Project).get(p.id) >> assert len(p2.parameters) == 2 >> assert len(p.parameters) == 2 >> >> Both of the assertions at the bottom fail, because the project >> instance >> still believes it has 3 parameters attached. Is this a bug, or >> should I >> be deleting the parameters differently? >> >> -Dave >> >>> > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy -~----------~----~----~----~------~----~------~--~---