]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fix to session.update() to preserve "dirty" status of incoming object
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 29 Nov 2006 21:50:45 +0000 (21:50 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 29 Nov 2006 21:50:45 +0000 (21:50 +0000)
CHANGES
lib/sqlalchemy/orm/session.py
test/orm/session.py

diff --git a/CHANGES b/CHANGES
index 0befda974c128c11c42b6cde85dbf0e5b1eccc3d..979041842acbf21be82ce7eadc90243b8e47e17d 100644 (file)
--- 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:
index 0a196d3d9d5cb434f53faaad934ebeaf5bf93f21..36522379ff04df3a3cc617cd78ddf0dea903e905 100644 (file)
@@ -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)
index fb163ccf05e5a57c4ecc9fd4608dfe223d7e57a0..3f8adc3e9c0f0c75b0247c44e64c6e4cec680e13 100644 (file)
@@ -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):