]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug where use of the :meth:`.Query.select_from` method would
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 13 Dec 2015 02:07:25 +0000 (21:07 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 13 Dec 2015 02:08:56 +0000 (21:08 -0500)
cause a subsequent call to the :meth:`.Query.with_parent` method to
fail. fixes #3606
- add mark-as-fail test for #3607

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/testing/exclusions.py
test/orm/test_query.py

index 30c58fa7f888b811f0a8ffda41007f0719760020..950046cd0eb6d0fd6d1d701bf07cc95bd1f2c6a7 100644 (file)
     .. include:: changelog_07.rst
         :start-line: 5
 
+.. changelog::
+    :version: 1.0.11
+
+    .. change::
+        :tags: bug, orm
+        :tickets: 3606
+        :versions: 1.1.0b1
+
+        Fixed bug where use of the :meth:`.Query.select_from` method would
+        cause a subsequent call to the :meth:`.Query.with_parent` method to
+        fail.
+
 .. changelog::
     :version: 1.0.10
     :released: December 11, 2015
index 6f4373ec537cbd361610341baa7b1d56a256651d..e1b920bbb4fe2b29516b6953e6b1c142bda16c68 100644 (file)
@@ -289,6 +289,8 @@ class Query(object):
         return self._entities[0]
 
     def _mapper_zero(self):
+        # TODO: self._select_from_entity is not a mapper
+        # so this method is misnamed
         return self._select_from_entity \
             if self._select_from_entity is not None \
             else self._entity_zero().entity_zero
@@ -942,11 +944,13 @@ class Query(object):
         """
 
         if property is None:
+            mapper_zero = inspect(self._mapper_zero()).mapper
+
             mapper = object_mapper(instance)
 
             for prop in mapper.iterate_properties:
                 if isinstance(prop, properties.RelationshipProperty) and \
-                        prop.mapper is self._mapper_zero():
+                        prop.mapper is mapper_zero:
                     property = prop
                     break
             else:
index 2a5b4aa6329099e4455c4445dca12498f047ab00..5d7baeb9c158d95add4f8a8cdf2bee4148eb9b9b 100644 (file)
@@ -398,8 +398,8 @@ def closed():
     return skip_if(BooleanPredicate(True, "marked as skip"))
 
 
-def fails():
-    return fails_if(BooleanPredicate(True, "expected to fail"))
+def fails(reason=None):
+    return fails_if(BooleanPredicate(True, reason or "expected to fail"))
 
 
 @decorator
index a373f1482945d2406203754f0de7fe7c7e22debb..d2f9e4a66b1eef3429421d49afaba94188b4bffa 100644 (file)
@@ -3216,6 +3216,39 @@ class ParentTest(QueryTest, AssertsCompiledSQL):
         #     sess.query(Order).with_parent(None, property='addresses').all()
         #     == [Order(description="order 5")]
 
+    def test_select_from(self):
+        User, Address = self.classes.User, self.classes.Address
+
+        sess = create_session()
+        u1 = sess.query(User).get(7)
+        q = sess.query(Address).select_from(Address).with_parent(u1)
+        self.assert_compile(
+            q,
+            "SELECT addresses.id AS addresses_id, "
+            "addresses.user_id AS addresses_user_id, "
+            "addresses.email_address AS addresses_email_address "
+            "FROM addresses WHERE :param_1 = addresses.user_id",
+            {'param_1': 7}
+        )
+
+    @testing.fails("issue #3607")
+    def test_select_from_alias(self):
+        User, Address = self.classes.User, self.classes.Address
+
+        sess = create_session()
+        u1 = sess.query(User).get(7)
+        a1 = aliased(Address)
+        q = sess.query(a1).with_parent(u1)
+        self.assert_compile(
+            q,
+            "SELECT addresses_1.id AS addresses_1_id, "
+            "addresses_1.user_id AS addresses_1_user_id, "
+            "addresses_1.email_address AS addresses_1_email_address "
+            "FROM addresses AS addresses_1 "
+            "WHERE :param_1 = addresses_1.user_id",
+            {'param_1': 7}
+        )
+
     def test_noparent(self):
         Item, User = self.classes.Item, self.classes.User