Skip to content

Commit 5205125

Browse files
authored
multiple arguments in WHERE clause (piccolo-orm#244)
* WHERE clause now will support multiple arguments(and empty clause) based on discussion piccolo-orm#237 * updated Docs
1 parent 7f062ad commit 5205125

File tree

9 files changed

+45
-18
lines changed

9 files changed

+45
-18
lines changed

docs/src/piccolo/query_clauses/where.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,21 @@ Using multiple ``where`` clauses is equivalent to an AND.
191191
b.popularity < 1000
192192
).run_sync()
193193
194+
Also, multiple arguments inside ``where`` clause is equivalent to an AND.
195+
196+
.. code-block:: python
197+
198+
b = Band
199+
200+
# These are equivalent:
201+
b.select().where(
202+
(b.popularity >= 100) & (b.popularity < 1000)
203+
).run_sync()
204+
205+
b.select().where(
206+
b.popularity >= 100, b.popularity < 1000
207+
).run_sync()
208+
194209
Using And / Or directly
195210
~~~~~~~~~~~~~~~~~~~~~~~
196211

piccolo/query/methods/count.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ def __init__(self, table: t.Type[Table], **kwargs):
2020
super().__init__(table, **kwargs)
2121
self.where_delegate = WhereDelegate()
2222

23-
def where(self, where: Combinable) -> Count:
24-
self.where_delegate.where(where)
23+
def where(self, *where: Combinable) -> Count:
24+
self.where_delegate.where(*where)
2525
return self
2626

2727
async def response_handler(self, response) -> bool:

piccolo/query/methods/delete.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ def __init__(self, table: t.Type[Table], force: bool = False, **kwargs):
2424
self.force = force
2525
self.where_delegate = WhereDelegate()
2626

27-
def where(self, where: Combinable) -> Delete:
28-
self.where_delegate.where(where)
27+
def where(self, *where: Combinable) -> Delete:
28+
self.where_delegate.where(*where)
2929
return self
3030

3131
def _validate(self):

piccolo/query/methods/exists.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def __init__(self, table: t.Type[Table], **kwargs):
2121
super().__init__(table, **kwargs)
2222
self.where_delegate = WhereDelegate()
2323

24-
def where(self, where: Combinable) -> Exists:
25-
self.where_delegate.where(where)
24+
def where(self, *where: Combinable) -> Exists:
25+
self.where_delegate.where(*where)
2626
return self
2727

2828
async def response_handler(self, response) -> bool:

piccolo/query/methods/objects.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ def order_by(self, *columns: Column, ascending=True) -> Objects:
155155
self.order_by_delegate.order_by(*columns, ascending=ascending)
156156
return self
157157

158-
def where(self, where: Combinable) -> Objects:
159-
self.where_delegate.where(where)
158+
def where(self, *where: Combinable) -> Objects:
159+
self.where_delegate.where(*where)
160160
return self
161161

162162
async def batch(

piccolo/query/methods/select.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ def output(
246246
)
247247
return self
248248

249-
def where(self, where: Combinable) -> Select:
250-
self.where_delegate.where(where)
249+
def where(self, *where: Combinable) -> Select:
250+
self.where_delegate.where(*where)
251251
return self
252252

253253
async def batch(

piccolo/query/methods/update.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def values(
3030
self.values_delegate.values(values)
3131
return self
3232

33-
def where(self, where: Combinable) -> Update:
34-
self.where_delegate.where(where)
33+
def where(self, *where: Combinable) -> Update:
34+
self.where_delegate.where(*where)
3535
return self
3636

3737
def validate(self):

piccolo/query/mixins.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,12 @@ def _extract_columns(self, combinable: Combinable):
113113
self._extract_columns(combinable.first)
114114
self._extract_columns(combinable.second)
115115

116-
def where(self, where: Combinable):
117-
if self._where:
118-
self._where = And(self._where, where)
119-
else:
120-
self._where = where
116+
def where(self, *where: Combinable):
117+
for arg in where:
118+
if self._where:
119+
self._where = And(self._where, arg)
120+
else:
121+
self._where = arg
121122

122123

123124
@dataclass

tests/table/test_select.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ def test_where_equals(self):
6363
)
6464
self.assertEqual(response, [{"name": "Pythonistas"}])
6565

66+
# check multiple arguments inside WHERE clause
67+
response = (
68+
Band.select(Band.name)
69+
.where(Band.manager.id == 1, Band.popularity == 500)
70+
.run_sync()
71+
)
72+
self.assertEqual(response, [])
73+
74+
# check empty WHERE clause
75+
response = Band.select(Band.name).where().run_sync()
76+
self.assertEqual(response, [{"name": "Pythonistas"}])
77+
6678
@postgres_only
6779
def test_where_like_postgres(self):
6880
"""
@@ -148,7 +160,6 @@ def test_where_ilike_sqlite(self):
148160
"%ist%",
149161
"%IST%",
150162
):
151-
152163
self.assertEqual(
153164
Band.select(Band.name)
154165
.where(Band.name.ilike(ilike_query))

0 commit comments

Comments
 (0)