]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Session.merge() now properly overwrites a many-to-one or
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Dec 2009 01:29:51 +0000 (01:29 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Dec 2009 01:29:51 +0000 (01:29 +0000)
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 6326030fc3b5f652fc62c532b3593455bb433bae..079814e038040200fd57ba7b9afa5d5a84d66059 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -776,6 +776,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 190be8d6602304f1d2a5b6b6a076500ebe1508ac..7d078cf1256dd1d83b6295f2d2d4a71f32af00cf 100644 (file)
@@ -661,11 +661,13 @@ class RelationProperty(StrategizedProperty):
             if current is not None:
                 _recursive[(current, self)] = True
                 obj = session._merge(current, load=load, _recursive=_recursive)
-                if obj is not None:
-                    if not load:
-                        dest_state.dict[self.key] = obj
-                    else:
-                        setattr(dest, self.key, obj)
+            else:
+                obj = None
+            
+            if not 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 e76e588d804a7a7cbeeca5dcf71de57d88856131..533c3ea5d12db5d3a0a17950d7bafb3789edbf56 100644 (file)
@@ -456,6 +456,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_no_load(self):
         mapper(User, users)