From: Mike Bayer Date: Mon, 14 Jul 2014 22:49:06 +0000 (-0400) Subject: - Fixed a regression from 0.9.0 due to :ticket:`2736` where the X-Git-Tag: rel_1_0_0b1~320 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ec40a84d96e43f35c54e7a9d398dc98ea7b16c50;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. fixes #3083 --- diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst index d678862e76..a2fc84b120 100644 --- a/doc/build/changelog/changelog_09.rst +++ b/doc/build/changelog/changelog_09.rst @@ -14,6 +14,18 @@ :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 diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 751f9f84b9..c340e98561 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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 " diff --git a/test/orm/test_froms.py b/test/orm/test_froms.py index 64e98e7456..7c06836d2f 100644 --- a/test/orm/test_froms.py +++ b/test/orm/test_froms.py @@ -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, diff --git a/test/orm/test_query.py b/test/orm/test_query.py index bac39b46bc..f7cd732ee0 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -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