summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 18:49:06 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-07-14 18:49:06 -0400
commitec40a84d96e43f35c54e7a9d398dc98ea7b16c50 (patch)
tree74a1b5149063e8e5f196305c48d6c820589829d5
parent461993641704c8825efd44ca67542b1901af094c (diff)
downloadsqlalchemy-ec40a84d96e43f35c54e7a9d398dc98ea7b16c50.tar.gz
- 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
-rw-r--r--doc/build/changelog/changelog_09.rst12
-rw-r--r--lib/sqlalchemy/orm/query.py1
-rw-r--r--test/orm/test_froms.py46
-rw-r--r--test/orm/test_query.py1
4 files changed, 60 insertions, 0 deletions
diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst
index d678862e7..a2fc84b12 100644
--- a/doc/build/changelog/changelog_09.rst
+++ b/doc/build/changelog/changelog_09.rst
@@ -15,6 +15,18 @@
: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
:versions: 1.0.0
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index 751f9f84b..c340e9856 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 64e98e745..7c06836d2 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 bac39b46b..f7cd732ee 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