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 -~----------~----~----~----~------~----~------~--~---