]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
adding convenience method exists() to Query (see # 2673)
authorDiana Clarke <diana.joan.clarke@gmail.com>
Fri, 29 Mar 2013 18:58:33 +0000 (14:58 -0400)
committerDiana Clarke <diana.joan.clarke@gmail.com>
Fri, 29 Mar 2013 18:58:33 +0000 (14:58 -0400)
doc/build/changelog/changelog_08.rst
lib/sqlalchemy/orm/query.py
test/orm/test_query.py

index 634ea4a953f672978248a5468dae5db1d6bcceac..96bbdb5a83bf1c142e24e7aeb916abb2bf4db3de 100644 (file)
@@ -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
index b18e28abbfa7c3fe342f234502152fd897b3248b..c80a430af1215aaf72e62e29797b50e2ee347764 100644 (file)
@@ -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.
 
index ac9c95f414b39e8131375141b65b863f2fb9471b..3882ec4b52aaf0caaa7a31a376b3052087f2c285 100644 (file)
@@ -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