From b139451bb609f28834fc3cb5d777ca2857f763f1 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 18 Mar 2021 10:27:28 -0400 Subject: [PATCH] Restore Query.selectable Fixes: #6088 Change-Id: Id014fbd081c0659d1939d059779780798cc8c1dd --- doc/build/changelog/unreleased_14/6088.rst | 7 ++++++ lib/sqlalchemy/orm/query.py | 12 +++++++++ test/orm/test_query.py | 29 ++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 doc/build/changelog/unreleased_14/6088.rst diff --git a/doc/build/changelog/unreleased_14/6088.rst b/doc/build/changelog/unreleased_14/6088.rst new file mode 100644 index 0000000000..85c98530d7 --- /dev/null +++ b/doc/build/changelog/unreleased_14/6088.rst @@ -0,0 +1,7 @@ +.. change:: + :tags: bug, regression, orm + :tickets: 6088 + + Fixed regression where the :attr:`_orm.Query.selectable` accessor, which is + a synonym for :meth:`_orm.Query.__clause_element__`, got removed, it's now + restored. diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 6a8a2c5713..96b4c56244 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -595,6 +595,18 @@ class Query( return self.enable_eagerloads(False).statement.scalar_subquery() + @property + def selectable(self): + """Return the :class:`_expression.Select` object emitted by this + :class:`_query.Query`. + + Used for :func:`_sa.inspect` compatibility, this is equivalent to:: + + query.enable_eagerloads(False).with_labels().statement + + """ + return self.__clause_element__() + def __clause_element__(self): return ( self.enable_eagerloads(False) diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 800c0ad5df..0613cfe06c 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -104,6 +104,35 @@ class MiscTest(QueryTest): assert q2.session is s2 assert q1.session is s1 + @testing.combinations( + (lambda s, User: s.query(User)), + (lambda s, User: s.query(User).filter_by(name="x")), + (lambda s, User: s.query(User.id, User.name).filter_by(name="x")), + ( + lambda s, User: s.query(func.count(User.id)).filter( + User.name == "x" + ) + ), + ) + def test_rudimentary_statement_accessors(self, test_case): + User = self.classes.User + + s = fixture_session() + + q1 = testing.resolve_lambda(test_case, s=s, User=User) + + is_true( + q1.statement.set_label_style( + LABEL_STYLE_TABLENAME_PLUS_COL + ).compare(q1.__clause_element__()) + ) + + is_true( + q1.statement.set_label_style( + LABEL_STYLE_TABLENAME_PLUS_COL + ).compare(q1.selectable) + ) + class OnlyReturnTuplesTest(QueryTest): def test_single_entity_false(self): -- 2.47.2