]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed a regression from 0.9.0 due to :ticket:`2736` where the
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Jul 2014 22:49:06 +0000 (18:49 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 14 Jul 2014 22:49:06 +0000 (18:49 -0400)
:meth:`.Query.select_from` method no longer set up the "from
entity" of the :class:`.Query` object correctly, so that
subsequent :meth:`.Query.filter_by` or :meth:`.Query.join`
calls would fail to check the appropriate "from" entity when
searching for attributes by string name.
fixes #3083

doc/build/changelog/changelog_09.rst
lib/sqlalchemy/orm/query.py
test/orm/test_froms.py
test/orm/test_query.py

index d678862e7679298397ee3732ba8193170ef75b7b..a2fc84b120635c68606f9d8fbc7f71ce1fa71d2b 100644 (file)
     :version: 0.9.7
     :released:
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 3083, 2736
+        :versions: 1.0.0
+
+        Fixed a regression from 0.9.0 due to :ticket:`2736` where the
+        :meth:`.Query.select_from` method no longer set up the "from
+        entity" of the :class:`.Query` object correctly, so that
+        subsequent :meth:`.Query.filter_by` or :meth:`.Query.join`
+        calls would fail to check the appropriate "from" entity when
+        searching for attributes by string name.
+
     .. change::
         :tags: bug, sql
         :tickets: 3090
index 751f9f84b946f635f392847ff5ce290546b62d28..c340e98561c6b1cc9166c9ed086ccc572a619cc9 100644 (file)
@@ -164,6 +164,7 @@ class Query(object):
 
             if hasattr(info, 'mapper') and \
                 (info.is_mapper or info.is_aliased_class):
+                self._select_from_entity = from_obj
                 if set_base_alias:
                     raise sa_exc.ArgumentError(
                             "A selectable (FromClause) instance is "
index 64e98e74568a6f11c921a653d81ab27097f9c317..7c06836d2f0b29b3a5eb127f2c641d45f3450d28 100644 (file)
@@ -1930,6 +1930,52 @@ class SelectFromTest(QueryTest, AssertsCompiledSQL):
             ]
         )
 
+    def test_join_relname_from_selected_from(self):
+        User, Address = self.classes.User, self.classes.Address
+        users, addresses = self.tables.users, self.tables.addresses
+        mapper(User, users, properties=
+            {'addresses': relationship(mapper(Address, addresses),
+                backref='user')})
+
+        sess = create_session()
+
+        self.assert_compile(
+            sess.query(User).select_from(Address).join("user"),
+            "SELECT users.id AS users_id, users.name AS users_name "
+            "FROM addresses JOIN users ON users.id = addresses.user_id"
+        )
+
+    def test_filter_by_selected_from(self):
+        User, Address = self.classes.User, self.classes.Address
+        users, addresses = self.tables.users, self.tables.addresses
+        mapper(User, users, properties=
+            {'addresses': relationship(mapper(Address, addresses))})
+
+        sess = create_session()
+
+        self.assert_compile(
+            sess.query(User).select_from(Address).
+            filter_by(email_address='ed').join(User),
+            "SELECT users.id AS users_id, users.name AS users_name "
+            "FROM addresses JOIN users ON users.id = addresses.user_id "
+            "WHERE addresses.email_address = :email_address_1"
+        )
+
+    def test_join_ent_selected_from(self):
+        User, Address = self.classes.User, self.classes.Address
+        users, addresses = self.tables.users, self.tables.addresses
+        mapper(User, users, properties=
+            {'addresses': relationship(mapper(Address, addresses))})
+
+        sess = create_session()
+
+        self.assert_compile(
+            sess.query(User).select_from(Address).join(User),
+            "SELECT users.id AS users_id, users.name AS users_name "
+            "FROM addresses JOIN users ON users.id = addresses.user_id"
+        )
+
+
     def test_join(self):
         users, Address, addresses, User = (self.tables.users,
                                 self.classes.Address,
index bac39b46bcd0c982d7b40aac44b009935a8337bb..f7cd732ee0693bcfd00be3d53311cf51ac58f808 100644 (file)
@@ -1486,6 +1486,7 @@ class FilterTest(QueryTest, AssertsCompiledSQL):
         assert [User(name='chuck')] == sess.query(User).filter_by(addresses = None).all()
         assert [User(name='chuck')] == sess.query(User).filter_by(addresses = null()).all()
 
+
     def test_filter_by_tables(self):
         users = self.tables.users
         addresses = self.tables.addresses