]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- merged r6553 from trunk
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Dec 2009 01:34:06 +0000 (01:34 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Dec 2009 01:34:06 +0000 (01:34 +0000)
- Session.merge() now properly overwrites a many-to-one or
uselist=False attribute to None if the attribute
is also None in the given object to be merged.

CHANGES
lib/sqlalchemy/orm/properties.py
test/orm/test_merge.py

diff --git a/CHANGES b/CHANGES
index 3cee14b5af416b9abe3205a2e002c332287a872e..e804822c375b32adf7a62ee837cb023a65375e69 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -28,6 +28,10 @@ CHANGES
       in expression which is an insert()/update()/delete() 
       construct. [ticket:1054]
       
+    - Session.merge() now properly overwrites a many-to-one or 
+      uselist=False attribute to None if the attribute 
+      is also None in the given object to be merged.
+     
     - Fixed a needless select which would occur when merging
       transient objects that contained a null primary key
       identifier.  [ticket:1618]
index e874e37471b18ec85304d4b016766d4d3166505d..e3ecad3b1039237077be8321b4388d552088ec1e 100644 (file)
@@ -665,11 +665,13 @@ class RelationProperty(StrategizedProperty):
             if current is not None:
                 _recursive[(current, self)] = True
                 obj = session._merge(current, dont_load=dont_load, _recursive=_recursive)
-                if obj is not None:
-                    if dont_load:
-                        dest_state.dict[self.key] = obj
-                    else:
-                        setattr(dest, self.key, obj)
+            else:
+                obj = None
+            
+            if dont_load:
+                dest_state.dict[self.key] = obj
+            else:
+                setattr(dest, self.key, obj)
 
     def cascade_iterator(self, type_, state, visited_instances, halt_on=None):
         if not type_ in self.cascade:
index d0f667237cf58e50fa91c9cec44abcd651416e07..4c8fb8783981729d34d03154e2e70b28dae3e38a 100644 (file)
@@ -454,6 +454,28 @@ class MergeTest(_fixtures.FixtureTest):
         eq_(on_load.called, 2)
         assert u3 is u
 
+    @testing.resolve_artifact_names
+    def test_value_to_none(self):
+        mapper(User, users, properties={
+            'address':relation(mapper(Address, addresses),uselist = False, backref='user')
+        })
+        sess = sessionmaker()()
+        u = User(id=7, name="fred", address=Address(id=1, email_address='foo@bar.com'))
+        sess.add(u)
+        sess.commit()
+        sess.close()
+        
+        u2 = User(id=7, name=None, address=None)
+        u3 = sess.merge(u2)
+        assert u3.name is None
+        assert u3.address is None
+        
+        sess.close()
+        
+        a1 = Address(id=1, user=None)
+        a2 = sess.merge(a1)
+        assert a2.user is None
+        
     @testing.resolve_artifact_names
     def test_transient_dontload(self):
         mapper(User, users)