From: Mike Bayer Date: Thu, 18 Mar 2021 14:27:28 +0000 (-0400) Subject: Restore Query.selectable X-Git-Tag: rel_1_4_2~13^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b139451bb609f28834fc3cb5d777ca2857f763f1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Restore Query.selectable Fixes: #6088 Change-Id: Id014fbd081c0659d1939d059779780798cc8c1dd --- 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):