From: Diana Clarke Date: Fri, 29 Mar 2013 18:58:33 +0000 (-0400) Subject: adding convenience method exists() to Query (see # 2673) X-Git-Tag: rel_0_8_1~3^2~11^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=423cd7fbf695d2becdfc83751a8dbc0650854bea;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git adding convenience method exists() to Query (see # 2673) --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index 634ea4a953..96bbdb5a83 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -6,6 +6,13 @@ .. changelog:: :version: 0.8.1 + .. change:: + :tags: feature, orm + :tickets: 2673 + + Added a convenience method to Query that turns a query into an + EXISTS subquery of the form EXISTS (SELECT 1 FROM ... WHERE ...) + .. change:: :tags: bug, mssql :pullreq: 47 diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index b18e28abbf..c80a430af1 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2373,6 +2373,26 @@ class Query(object): kwargs.get('offset') is not None or kwargs.get('distinct', False)) + def exists(self): + """A convenience method that turns a query into an EXISTS subquery + of the form EXISTS (SELECT 1 FROM ... WHERE ...). + + e.g.:: + + q = session.query(User).filter(User.name == 'fred') + session.query(q.exists()) + + Producing SQL similar to:: + + SELECT EXISTS ( + SELECT 1 FROM users WHERE users.name = :name_1 + ) AS anon_1 + + .. versionadded:: 0.8.1 + + """ + return sql.exists(self.with_entities('1').statement) + def count(self): """Return a count of rows this Query would return. diff --git a/test/orm/test_query.py b/test/orm/test_query.py index ac9c95f414..3882ec4b52 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -1620,6 +1620,21 @@ class AggregateTest(QueryTest): assert [User(name=u'jack',id=7), User(name=u'fred',id=9)] == sess.query(User).order_by(User.id).group_by(User).join('addresses').having(func.count(Address.id)< 2).all() + +class ExistsTest(QueryTest, AssertsCompiledSQL): + + def test_exists(self): + User = self.classes.User + sess = create_session() + q1 = sess.query(User).filter(User.name == 'fred') + self.assert_compile(sess.query(q1.exists()), + 'SELECT EXISTS (' + 'SELECT 1 FROM users WHERE users.name = :name_1' + ') AS anon_1', + dialect=default.DefaultDialect() + ) + + class CountTest(QueryTest): def test_basic(self): users, User = self.tables.users, self.classes.User