On Aug 18, 2006, at 12:29 PM, Michael Bayer wrote:

> I addressed this issue the way I described earlier, that upon setting
> up a relationship with "delete-orphan", a flag is tacked onto that
> relatoinship's mapper that "orphans should be deleted" regardless of
> the presence of any collection with which to cascade from.
>
> Also, I did temporarily establish the rule we discussed where save()-
> ing an orphaned entity will immediately raise an error; however, this
> is incompatible with the "contextual session" since the entity is
> added to the session upon construction and would render it impossible
> to create new entities.    you can see the commented-out check in the
> changeset if youd like to uncomment it for experimentation.
>
> what does happen now if you save() an orphaned entity is that it just
> doesnt get saved.  we could try to put the check further down at
> flush time perhaps.
>
> also, an interesting effect that I didnt think of came up from this,
> which is that you now no longer can declare a "delete-orphan" cascade
> rule on a self-referential relationship....since the root of a tree
> structure is always an orphan.  (of course, you could have a
> circularly-linked structure, which probably requires the post_update
> flag to be set; but i think that case is fringe enough that folks
> could handle the deletes manually in that case.)
>
> so check out the changeset, which includes the two new tests in a new
> session.py unit test module:
>
> http://www.sqlalchemy.org/trac/changeset/1807
>

OK, since I updated to r1815 things are starting to work better. But  
I'm still having problems with orphaned items being saved. There's a  
test case attached. Here's a quick overview:

         s = create_session()
         order = Order()
         s.save(order)

         item = Item()
         attr = Attribute()
         item.attributes.append(attr)

         order.items.append(item)
         order.items.remove(item)
         s.flush()

The flush() attempts to insert the attribute associated with the item  
even though the item was removed from the order and is therefore  
transient. In other words item is an orphan, but flush() erroneously  
tries to save attr since _is_orphan(attr) returns False. I would  
suggest order.items.remove(item) would cascade to all of item's  
children and register them as deleted as well (just like  
order.items.append(item) causes all of item's children to be save 
()'d ). Alternately, _is_orphan() could be modified to check all  
parent items and detect if they are orphans as well.

Thanks.

~ Daniel

P.S. I never actually tried the first patch you had given me  
regarding this issue, do you still want me to do that? I figured you  
had patched it or something better into the trunk in r1807.

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to