yup.  specifically with the session.delete() thing, by you saying  
parent.collection.remove(obj), you're doing the collection management  
yourself.  delete(x) doesn't work since SQLA does not attempt to  
locate all the collections which "x" is a part of.    It's a very  
common issue but we dont at this time have any straightforward and  
performant technique of tracking parent collection membership.

On Oct 25, 2008, at 2:36 PM, jack2318 wrote:

>
> Hi Mike,
> Thanks. I learning SQA and I am trying to get the general feeling.
> I guess the idea is to use Python directly and Session take care of
> the SQL in the background.
>
> mOutOrder = mapper(dbOutOrder, tbl_outHeader, properties={'lines':
> relation(dbOutLine, cascade="all, delete-orphan")})
> mOutLine = mapper(dbOutLine, tbl_outLine)
>
>        session = Session()
>        order = session.query(dbOutOrder).get(2)
>
>        tmp_list = order.lines[:]
>        for line in tmp_list:
>           order.lines.remove(line)
>
>        for i in range(1,10):
>            line = dbOutLine()
>            order.lines.append(line)
>
>        i = 0
>        tmp_list = order.lines[:]
>        for line in tmp_list:
>            if i % 2 == 0:
>                order.lines.remove(line)
>            i += 1
>
>        session.commit()
>
> -- jacek
>
> On Oct 24, 6:27 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
>> On Oct 24, 2008, at 9:08 PM, jack2318 wrote:
>>
>>
>>
>>
>>
>>> I am really sorry but I pressed POST before I was ready. So again  
>>> the
>>> code (without comments)
>>
>>>       session = Session()
>>>        order = session.query(dbOutOrder).get(2)
>>
>>>        for line in order.lines:
>>>           session.delete(line)
>>>        session.flush()
>>
>>>        for i in range(1,10):
>>>            line = dbOutLine()
>>>            line.HEADER_id = order.id
>>>            line.ITEM_SKU_id = 1
>>>            line.QTY = 1
>>
>>>            order.lines.append(line)
>>
>>>        session.add(order)
>>>        session.flush()
>>
>>>        i = 0
>>>        for line in order.lines:
>>>            if i % 2 == 0:
>>>                print "DELETE"
>>>                session.delete(line)
>>>            i += 1
>>>        session.commit()
>>
>>> and the mappers:
>>> mOutOrder = mapper(dbOutOrder, tbl_outHeader, properties={'lines':
>>> relation(dbOutLine)})
>>> mOutLine = mapper(dbOutLine, tbl_outLine)
>>
>>> as soon as I get to commit I get error:
>>
>>> Unexpected error: <class
>>> 'sqlalchemy.orm.exc.ConcurrentModificationError'> Deleted rowcount 5
>>> does not match number of objects deleted 7
>>
>>> What I am doing wrong?  Of course if I issue commit after first  
>>> delete
>>> everything is fine.
>>
>> session.delete(someobject) does not remove the object from
>> collections.  You're issuing delete() on some of the members of
>> order.lines twice (delete() puts them back into the session after
>> they've been removed).   If you issue a commit(), the order.lines
>> collection is expired so it refreshes the most current data on next
>> access and therefore the problem is eliminated.
>>
>> Instead of issuing delete() on collection members, just remove them
>> from the collection and use cascade="all, delete-orphan" on the
>> order.lines relation.
>>
>> also "order" is already in the session; no need to add() it a second
>> time.
> >


--~--~---------~--~----~------------~-------~--~----~
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?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to