can you show me your full mapping ? im confused how the Parameter instance would be present in two collections on the same parent object at the same time.
On Oct 27, 2006, at 1:28 PM, Hogarty, David A. wrote: > > That might be worth doing... the example I gave of deleting from both > lists seems to fail erratically based on when and how the lists were > referenced before removal. > > For example, the following: > > def test_node_polymorphism(self): > p = Project(name='p') > db.session.save(p) > p.nodes > p.nodes.append(Parameter(name='p1')) > db.session.flush() > assert len(p.nodes) == 1 > assert len(p.parameters) == 1 > > passes, while adding a p.parameters reference before the assertions > causes the second assertion to fail, because len(p.parameters) is > still > 0 from the first reference > > def test_node_polymorphism(self): > p = Project(name='p1') > db.session.save(p) > p.nodes > p.parameters > p.nodes.append(Parameter(name='prm1')) > db.session.flush() > assert len(p.nodes) == 1 > assert len(p.parameters) == 1 > > -----Original Message----- > From: sqlalchemy@googlegroups.com [mailto:[EMAIL PROTECTED] > On Behalf Of Michael Bayer > Sent: Friday, October 27, 2006 10:37 AM > To: sqlalchemy@googlegroups.com > Subject: [sqlalchemy] Re: related object list not being updated on > delete > > > 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 -~----------~----~----~----~------~----~------~--~---