]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug involving dynamic attributes, that was again a regression
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 26 Jun 2014 18:58:42 +0000 (14:58 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 26 Jun 2014 18:59:16 +0000 (14:59 -0400)
of :ticket:`3060` from verision 0.9.5.  A self-referential relationship
with lazy='dynamic' would raise a TypeError within a flush operation.
fixes #3099

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/orm/dynamic.py
test/orm/test_dynamic.py

index 691322a8fca70b4804181bbc81a9b594be975733..6ac46bcd48e054846819c5f2c545020e0c745881 100644 (file)
     :version: 0.9.7
     :released:
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 3099
+
+        Fixed bug involving dynamic attributes, that was again a regression
+        of :ticket:`3060` from verision 0.9.5.  A self-referential relationship
+        with lazy='dynamic' would raise a TypeError within a flush operation.
+
     .. change::
         :tags: bug, declarative
         :tickets: 3097
index bae09d32d510ab731573990929d2ec5dfbeb2876..82e0b00481ad354142ee3a706f03be131b78d462 100644 (file)
@@ -171,9 +171,10 @@ class DynamicAttributeImpl(attributes.AttributeImpl):
         c = self._get_collection_history(state, passive)
         return c.as_history()
 
-    def get_all_pending(self, state, dict_):
+    def get_all_pending(self, state, dict_,
+                                passive=attributes.PASSIVE_NO_INITIALIZE):
         c = self._get_collection_history(
-            state, attributes.PASSIVE_NO_INITIALIZE)
+            state, passive)
         return [
                 (attributes.instance_state(x), x)
                 for x in
index 21dcfd436c4c2510e4d9a092f08094642258458a..54ea3c2f1e902f85a3cdb6c5a2c7fe3ca73695da 100644 (file)
@@ -600,6 +600,23 @@ class UOWTest(_DynamicFixture, _fixtures.FixtureTest,
     def test_delete_cascade(self):
         self._test_delete_cascade(False)
 
+    def test_self_referential(self):
+        Node, nodes = self.classes.Node, self.tables.nodes
+
+
+        mapper(Node, nodes, properties={
+            'children': relationship(Node, lazy="dynamic", order_by=nodes.c.id)
+        })
+
+        sess = Session()
+        n2, n3 = Node(), Node()
+        n1 = Node(children=[n2, n3])
+        sess.add(n1)
+        sess.commit()
+
+        eq_(n1.children.all(), [n2, n3])
+
+
     def test_remove_orphans(self):
         addresses = self.tables.addresses
         User, Address = self._user_address_fixture(addresses_args={