Skip to content

Commit ffb304f

Browse files
authored
feat: select all columns by default (#509)
1 parent 8e0a1d4 commit ffb304f

File tree

5 files changed

+47
-16
lines changed

5 files changed

+47
-16
lines changed

postgrest/_async/request_builder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def select(
282282
self,
283283
*columns: str,
284284
count: Optional[CountMethod] = None,
285+
head: Optional[bool] = None,
285286
) -> AsyncSelectRequestBuilder[_ReturnT]:
286287
"""Run a SELECT query.
287288
@@ -291,7 +292,7 @@ def select(
291292
Returns:
292293
:class:`AsyncSelectRequestBuilder`
293294
"""
294-
method, params, headers, json = pre_select(*columns, count=count)
295+
method, params, headers, json = pre_select(*columns, count=count, head=head)
295296
return AsyncSelectRequestBuilder[_ReturnT](
296297
self.session, self.path, method, headers, params, json
297298
)

postgrest/_sync/request_builder.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ def select(
282282
self,
283283
*columns: str,
284284
count: Optional[CountMethod] = None,
285+
head: Optional[bool] = None,
285286
) -> SyncSelectRequestBuilder[_ReturnT]:
286287
"""Run a SELECT query.
287288
@@ -291,7 +292,7 @@ def select(
291292
Returns:
292293
:class:`SyncSelectRequestBuilder`
293294
"""
294-
method, params, headers, json = pre_select(*columns, count=count)
295+
method, params, headers, json = pre_select(*columns, count=count, head=head)
295296
return SyncSelectRequestBuilder[_ReturnT](
296297
self.session, self.path, method, headers, params, json
297298
)

postgrest/base_request_builder.py

+19-6
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,29 @@ def _unique_columns(json: List[Dict]):
5252
return columns
5353

5454

55+
def _cleaned_columns(columns: str) -> str:
56+
quoted = False
57+
result = []
58+
59+
for c in columns:
60+
if c.isspace() and not quoted:
61+
continue
62+
if c == '"':
63+
quoted = not quoted
64+
result.append(c)
65+
66+
return ",".join(result)
67+
68+
5569
def pre_select(
5670
*columns: str,
5771
count: Optional[CountMethod] = None,
72+
head: Optional[bool] = None,
5873
) -> QueryArgs:
59-
if columns:
60-
method = RequestMethod.GET
61-
params = QueryParams({"select": ",".join(columns)})
62-
else:
63-
method = RequestMethod.HEAD
64-
params = QueryParams()
74+
method = RequestMethod.HEAD if head else RequestMethod.GET
75+
cleaned_columns = _cleaned_columns(columns or "*")
76+
params = QueryParams({"select": cleaned_columns})
77+
6578
headers = Headers({"Prefer": f"count={count}"}) if count else Headers()
6679
return QueryArgs(method, params, headers, {})
6780

tests/_async/test_request_builder.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,16 @@ def test_select(self, request_builder: AsyncRequestBuilder):
3131
def test_select_with_count(self, request_builder: AsyncRequestBuilder):
3232
builder = request_builder.select(count=CountMethod.exact)
3333

34-
assert builder.params.get("select") is None
34+
assert builder.params["select"] == "*"
3535
assert builder.headers["prefer"] == "count=exact"
36+
assert builder.http_method == "GET"
37+
assert builder.json == {}
38+
39+
def test_select_with_head(self, request_builder: AsyncRequestBuilder):
40+
builder = request_builder.select("col1", "col2", head=True)
41+
42+
assert builder.params.get("select") == "col1,col2"
43+
assert builder.headers.get("prefer") is None
3644
assert builder.http_method == "HEAD"
3745
assert builder.json == {}
3846

@@ -193,15 +201,15 @@ def test_explain_options(self, request_builder: AsyncRequestBuilder):
193201
class TestOrder:
194202
def test_order(self, request_builder: AsyncRequestBuilder):
195203
builder = request_builder.select().order("country_name", desc=True)
196-
assert str(builder.params) == "order=country_name.desc"
204+
assert str(builder.params) == "select=%2A&order=country_name.desc"
197205

198206
def test_multiple_orders(self, request_builder: AsyncRequestBuilder):
199207
builder = (
200208
request_builder.select()
201209
.order("country_name", desc=True)
202210
.order("iso", desc=True)
203211
)
204-
assert str(builder.params) == "order=country_name.desc%2Ciso.desc"
212+
assert str(builder.params) == "select=%2A&order=country_name.desc%2Ciso.desc"
205213

206214
def test_multiple_orders_on_foreign_table(self, request_builder: AsyncRequestBuilder):
207215
foreign_table = "cities"
@@ -212,7 +220,7 @@ def test_multiple_orders_on_foreign_table(self, request_builder: AsyncRequestBui
212220
)
213221
assert (
214222
str(builder.params)
215-
== "order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
223+
== "select=%2A&order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
216224
)
217225

218226

tests/_sync/test_request_builder.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,16 @@ def test_select(self, request_builder: SyncRequestBuilder):
3131
def test_select_with_count(self, request_builder: SyncRequestBuilder):
3232
builder = request_builder.select(count=CountMethod.exact)
3333

34-
assert builder.params.get("select") is None
34+
assert builder.params["select"] == "*"
3535
assert builder.headers["prefer"] == "count=exact"
36+
assert builder.http_method == "GET"
37+
assert builder.json == {}
38+
39+
def test_select_with_head(self, request_builder: SyncRequestBuilder):
40+
builder = request_builder.select("col1", "col2", head=True)
41+
42+
assert builder.params.get("select") == "col1,col2"
43+
assert builder.headers.get("prefer") is None
3644
assert builder.http_method == "HEAD"
3745
assert builder.json == {}
3846

@@ -193,15 +201,15 @@ def test_explain_options(self, request_builder: SyncRequestBuilder):
193201
class TestOrder:
194202
def test_order(self, request_builder: SyncRequestBuilder):
195203
builder = request_builder.select().order("country_name", desc=True)
196-
assert str(builder.params) == "order=country_name.desc"
204+
assert str(builder.params) == "select=%2A&order=country_name.desc"
197205

198206
def test_multiple_orders(self, request_builder: SyncRequestBuilder):
199207
builder = (
200208
request_builder.select()
201209
.order("country_name", desc=True)
202210
.order("iso", desc=True)
203211
)
204-
assert str(builder.params) == "order=country_name.desc%2Ciso.desc"
212+
assert str(builder.params) == "select=%2A&order=country_name.desc%2Ciso.desc"
205213

206214
def test_multiple_orders_on_foreign_table(self, request_builder: SyncRequestBuilder):
207215
foreign_table = "cities"
@@ -212,7 +220,7 @@ def test_multiple_orders_on_foreign_table(self, request_builder: SyncRequestBuil
212220
)
213221
assert (
214222
str(builder.params)
215-
== "order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
223+
== "select=%2A&order=cities%28city_name%29.desc%2Ccities%28id%29.desc"
216224
)
217225

218226

0 commit comments

Comments
 (0)