diff options
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/session.py | 4 | ||||
-rw-r--r-- | test/orm/session.py | 4 |
3 files changed, 11 insertions, 1 deletions
@@ -69,6 +69,10 @@ CHANGES may now be a mix of lists and tuples. (Previously members were always lists.) + - Session.delete() adds the given object to the session if + not already present. This was a regression bug from 0.4 + [ticket:1150] + - The `echo_uow` flag on `Session` is deprecated, and unit-of-work logging is now application-level only, not per-session level. diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index bd271e96d..20bb85e80 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1241,6 +1241,7 @@ class Session(object): raise sa_exc.InvalidRequestError( "Object '%s' already has an identity - it can't be registered " "as pending" % mapperutil.state_str(state)) + self._attach(state) if state not in self._new: self._new[state] = state.obj() @@ -1290,8 +1291,9 @@ class Session(object): "different identity" % (mapperutil.state_str(state), state.key)) - self._deleted[state] = state.obj() self._attach(state) + self._deleted[state] = state.obj() + self.identity_map.add(state) def _attach(self, state): if state.session_id and state.session_id is not self.hash_key: diff --git a/test/orm/session.py b/test/orm/session.py index 0282d28fd..f06b20515 100644 --- a/test/orm/session.py +++ b/test/orm/session.py @@ -660,7 +660,11 @@ class SessionTest(_fixtures.FixtureTest): u2 = s2.query(User).get(user.id) self.assertRaisesMessage(sa.exc.InvalidRequestError, "already persisted with a different identity", s.delete, u2) + s.expunge(user) + assert user not in s s.delete(user) + assert user in s + s.flush() assert user not in s assert s.query(User).count() == 0 |