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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.