Hi everyone! I have a client-server application where sometimes I need to modify a cascaded member of a one-to-many relation directly, that is by saving itself instead of its parent. This works, but if later the user *does* save the parent, I get a "A conflicting state is already present in the identity map" error, and I don't know if I'm simply doing something I'm not supposed to :)
I narrowed down the issue to this example: from sqlalchemy import Column, String, Integer, Table, ForeignKey from sqlalchemy.engine import create_engine from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Child(Base): __tablename__ = "children" id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey("parents.id")) class Parent(Base): __tablename__ = "parents" id = Column(Integer, primary_key=True) children = relationship(Child, cascade="save-update", uselist=True) en = create_engine("sqlite:///:memory:", echo=True) Base.metadata.create_all(en) maker = sessionmaker(en) session = maker(autocommit=True) # Save a parent with a child par = Parent() par.children = [ Child() ] session.add(par) session.flush() child_id = par.children[0].id # For later # Clean the session (simulate another client-server session) session.expunge_all() # Reload the children q = session.query(Child) q = q.filter(Child.id == child_id) child_reloaded = q.first() # Reassign to the parent and save par.children = [child_reloaded] session.add(par) I tested this on SQLalchemy 0.9.4: Traceback (most recent call last): File "testsa.py", line 44, in <module> session.add(par) File "/home/joril/src/newprg/branches/sqla09/sqlalchemy/orm/session.py", line 1478, in add self._save_or_update_state(state) File "/home/joril/src/newprg/branches/sqla09/sqlalchemy/orm/session.py", line 1497, in _save_or_update_state self._save_or_update_impl(st_) File "/home/joril/src/newprg/branches/sqla09/sqlalchemy/orm/session.py", line 1746, in _save_or_update_impl self._update_impl(state) File "/home/joril/src/newprg/branches/sqla09/sqlalchemy/orm/session.py", line 1739, in _update_impl self.identity_map.add(state) File "/home/joril/src/newprg/branches/sqla09/sqlalchemy/orm/identity.py", line 119, in add % (key, )) AssertionError: A conflicting state is already present in the identity map for key (<class '__main__.Child'>, (1,)) Is this supposed to happen? Many thanks! -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.