]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
The where method of exists now accepts multiple cluase.
authorFederico Caselli <cfederico87@gmail.com>
Sat, 4 Dec 2021 22:08:05 +0000 (23:08 +0100)
committerFederico Caselli <cfederico87@gmail.com>
Sat, 4 Dec 2021 22:08:05 +0000 (23:08 +0100)
Support multiple clause elements in the :meth:`_sql.Exists.where` method,
unifying the api with the on presented by a normal :func:`_sql.select`
construct.

Fixes: #7386
Change-Id: I5df20478008cd5167053d357cbfad8a641c62b44

doc/build/changelog/unreleased_14/7386.rst [new file with mode: 0644]
lib/sqlalchemy/sql/selectable.py
test/sql/test_compiler.py

diff --git a/doc/build/changelog/unreleased_14/7386.rst b/doc/build/changelog/unreleased_14/7386.rst
new file mode 100644 (file)
index 0000000..e344453
--- /dev/null
@@ -0,0 +1,7 @@
+.. change::
+    :tags: usecase, sql
+    :tickets: 7386
+
+    Support multiple clause elements in the :meth:`_sql.Exists.where` method,
+    unifying the api with the on presented by a normal :func:`_sql.select`
+    construct.
index a82a76e53ad550aa1ea13c6728506a6e2f3f7816..ca3ccc6bc458027f1924f7ee7f6802aecddc9a25 100644 (file)
@@ -6490,6 +6490,9 @@ class Exists(UnaryExpression):
 
     See :func:`_sql.exists` for a description of usage.
 
+    An ``EXISTS`` clase can also be construed from a :func:`_sql.select`
+    instance by calling :meth:`_sql.SelectBase.exists`.
+
     """
 
     _from_objects = []
@@ -6528,6 +6531,9 @@ class Exists(UnaryExpression):
 
             :ref:`tutorial_exists` - in the :term:`2.0 style` tutorial.
 
+            :meth:`_sql.SelectBase.exists` - method to transform a ``SELECT`` to an
+            ``EXISTS`` clause.
+
         """  # noqa E501
         if args and isinstance(args[0], (SelectBase, ScalarSelect)):
             s = args[0]
@@ -6642,7 +6648,7 @@ class Exists(UnaryExpression):
         e.element = self._regroup(lambda element: element.select_from(*froms))
         return e
 
-    def where(self, clause):
+    def where(self, *clause):
         """Return a new :func:`_expression.exists` construct with the
         given expression added to
         its WHERE clause, joined to the existing clause via AND, if any.
@@ -6655,7 +6661,7 @@ class Exists(UnaryExpression):
 
         """
         e = self._clone()
-        e.element = self._regroup(lambda element: element.where(clause))
+        e.element = self._regroup(lambda element: element.where(*clause))
         return e
 
 
index 6779ea7bf7e0bda55cd2950aa5b352f15ff175fe..55c2b07c4d0453acbf69a9c0b2a97fdf28758391 100644 (file)
@@ -1241,6 +1241,14 @@ class SelectTest(fixtures.TestBase, AssertsCompiledSQL):
             "SELECT NOT (NOT (EXISTS (SELECT 1))) AS anon_1",
         )
 
+        self.assert_compile(
+            exists(42)
+            .select_from(table1)
+            .where(table1.c.name == "foo", table1.c.description == "bar"),
+            "EXISTS (SELECT 42 FROM mytable WHERE mytable.name = :name_1 "
+            "AND mytable.description = :description_1)",
+        )
+
     def test_exists_method(self):
         subq = (
             select(func.count(table2.c.otherid))