]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- [bug] Fixed issue in unit of work
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 4 May 2012 23:27:52 +0000 (19:27 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 4 May 2012 23:27:52 +0000 (19:27 -0400)
    whereby setting a non-None self-referential
    many-to-one relationship to None
    would fail to persist the change if the
    former value was not already loaded.
    [ticket:2477].

CHANGES
lib/sqlalchemy/orm/attributes.py
test/orm/test_unitofworkv2.py

diff --git a/CHANGES b/CHANGES
index fde7c681d62c7719bd442934f1405a04ab7ab217..d29e6287ab905d4a5a51fe5cfcc35db4ea2486fb 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,13 @@ CHANGES
 0.7.7
 =====
 - orm
+  - [bug] Fixed issue in unit of work
+    whereby setting a non-None self-referential
+    many-to-one relationship to None
+    would fail to persist the change if the
+    former value was not already loaded.
+    [ticket:2477].
+
   - [feature] Added prefix_with() method
     to Query, calls upon select().prefix_with()
     to allow placement of MySQL SELECT
index 3b4f18b310750ce384045ef6af1f076661363ad7..a7e1824a65c49c708d202f1a82167d72ea35ccb7 100644 (file)
@@ -653,7 +653,7 @@ class ScalarObjectAttributeImpl(ScalarAttributeImpl):
             if current is not None:
                 ret = [(instance_state(current), current)]
             else:
-                ret = []
+                ret = [(None, None)]
 
             if self.key in state.committed_state:
                 original = state.committed_state[self.key]
index d7e2150db5a102f56df19e5a7ac41e683e53e183..cfd36e696d10d44f360a50b833a0fbe079792716 100644 (file)
@@ -777,6 +777,31 @@ class SingleCycleTest(UOWTest):
                         lambda ctx: {'id':n1.id})
         )
 
+    def test_many_to_one_set_null_unloaded(self):
+        Node, nodes = self.classes.Node, self.tables.nodes
+
+        mapper(Node, nodes, properties={
+            'parent':relationship(Node, remote_side=nodes.c.id)
+        })
+        sess = create_session()
+        n1 = Node(data='n1')
+        n2 = Node(data='n2', parent=n1)
+        sess.add_all([n1, n2])
+        sess.flush()
+        sess.close()
+
+        n2 = sess.query(Node).filter_by(data='n2').one()
+        n2.parent = None
+        self.assert_sql_execution(
+            testing.db,
+            sess.flush,
+            CompiledSQL(
+                "UPDATE nodes SET parent_id=:parent_id WHERE "
+                "nodes.id = :nodes_id",
+                lambda ctx: {"parent_id":None, "nodes_id":n2.id}
+            )
+        )
+
     def test_cycle_rowswitch(self):
         Node, nodes = self.classes.Node, self.tables.nodes