From 6bba73a9f3bd10e23ceaf14349ef10978b7eb5df Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 29 Nov 2006 21:50:45 +0000 Subject: [PATCH] - fix to session.update() to preserve "dirty" status of incoming object --- CHANGES | 1 + lib/sqlalchemy/orm/session.py | 4 ++-- test/orm/session.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 0befda974c..979041842a 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,7 @@ to create a scalar subquery. - added extra check to "stop" cascading on save/update/save-update if an instance is detected to be already in the session. +- fix to session.update() to preserve "dirty" status of incoming object 0.3.1 - Engine/Pool: diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 0a196d3d9d..36522379ff 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -367,8 +367,8 @@ class Session(object): return if not hasattr(object, '_instance_key'): raise exceptions.InvalidRequestError("Instance '%s' is not persisted" % repr(object)) - self._register_persistent(object) - + self._attach(object) + def _register_pending(self, obj): self._attach(obj) self.uow.register_new(obj) diff --git a/test/orm/session.py b/test/orm/session.py index fb163ccf05..3f8adc3e9c 100644 --- a/test/orm/session.py +++ b/test/orm/session.py @@ -61,6 +61,38 @@ class SessionTest(AssertMixin): tran.close() finally: c.close() + + def test_update(self): + """test that the update() method functions and doesnet blow away changes""" + tables.delete() + s = create_session() + class User(object):pass + mapper(User, users) + + # save user + s.save(User()) + s.flush() + user = s.query(User).selectone() + s.expunge(user) + assert user not in s + + # modify outside of session, assert changes remain/get saved + user.user_name = "fred" + s.update(user) + assert user in s + assert user in s.dirty + s.flush() + s.clear() + user = s.query(User).selectone() + assert user.user_name == 'fred' + + # insure its not dirty if no changes occur + s.clear() + assert user not in s + s.update(user) + assert user in s + assert user not in s.dirty + class OrphanDeletionTest(AssertMixin): -- 2.47.2