Hi,
I've run into a rather interesting issue, where calling session.rollback()
dies. The error I get with SQLA 0.7 is:
<class 'sqlalchemy.exc.InvalidRequestError'>: Can't attach instance <Foo at
0x2acf68808710>; another instance with key (<class 'module.Foo'>, (342,)) is
already present in this session.
Traceback:
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:672:rollback
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:386:rollback
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:417:_rollback_impl
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:274:_restore_snapshot
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:1620:_update_impl
sqlalchemy-rel_0_7/lib/sqlalchemy/orm/session.py:1648:_attach
0.8 gives a slightly different message, but I think it is essentially the same:
<type 'exceptions.AssertionError'>: A conflicting state is already present in
the identity map for key (<class 'module.Foo'>, (342,))
Traceback:
sqlalchemy-default/lib/sqlalchemy/orm/session.py:637:rollback
sqlalchemy-default/lib/sqlalchemy/orm/session.py:346:rollback
sqlalchemy-default/lib/sqlalchemy/orm/session.py:377:_rollback_impl
sqlalchemy-default/lib/sqlalchemy/orm/session.py:233:_restore_snapshot
sqlalchemy-default/lib/sqlalchemy/orm/session.py:1578:_update_impl
sqlalchemy-default/lib/sqlalchemy/orm/identity.py:115:add
What I see when turning on query logging:
- The Foo object with primary key 342 is loaded (using a non-primary
mapper, if that makes any difference), and then deleted. The session is flushed.
- A new object is created (this time using the primary mapper), and
during INSERT, SQLite assigns the same primary key to it as the previously
deleted object had (I can see that from subsequent SELECT statements
referencing the new object; it would be nice if SQLA logged the primary key
after an INSERT at debug level)
- An application error (unrelated to SQLAlchemy) occurs, which causes
rollback() to be called
I have a reliable reproducer, but it is the unit test of a large application,
so there are lots of possibly unrelated things going on. I've spent two days
coming up with a standalone reproducer, but I've failed, that's why I'm sending
this mail instead of opening a ticket.
Any ideas?
Gabor
--------------------------------------------------------------------------
NOTICE: Morgan Stanley is not acting as a municipal advisor and the opinions or
views contained herein are not intended to be, and do not constitute, advice
within the meaning of Section 975 of the Dodd-Frank Wall Street Reform and
Consumer Protection Act. If you have received this communication in error,
please destroy all electronic and paper copies and notify the sender
immediately. Mistransmission is not intended to waive confidentiality or
privilege. Morgan Stanley reserves the right, to the extent permitted under
applicable law, to monitor electronic communications. This message is subject
to terms available at the following link:
http://www.morganstanley.com/disclaimers. If you cannot access these links,
please notify us by reply message and we will send the contents to you. By
messaging with Morgan Stanley you consent to the foregoing.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
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.