New .rows_where(select=) argument

This commit is contained in:
Simon Willison 2020-09-22 16:10:14 -07:00
commit 71782311ce
3 changed files with 11 additions and 4 deletions

View file

@ -145,7 +145,7 @@ View objects are similar to Table objects, except that any attempts to insert or
* ``count``
* ``schema``
* ``rows``
* ``rows_where(where, where_args, order_by)``
* ``rows_where(where, where_args, order_by, select)``
* ``drop()``
.. _python_api_rows:
@ -168,6 +168,13 @@ You can filter rows by a WHERE clause using ``.rows_where(where, where_args)``::
... print(row)
{'id': 1, 'age': 4, 'name': 'Cleo'}
To return custom columns (instead of using ``select *``) pass ``select=``::
>>> db = sqlite_utils.Database("dogs.db")
>>> for row in db["dogs"].rows_where(select='name, age'):
... print(row)
{'name': 'Cleo', 'age': 4}
To specify an order, use the ``order_by=`` argument::
>>> for row in db["dogs"].rows_where("age > 1", order_by="age"):

View file

@ -532,10 +532,10 @@ class Queryable:
def rows(self):
return self.rows_where()
def rows_where(self, where=None, where_args=None, order_by=None):
def rows_where(self, where=None, where_args=None, order_by=None, select="*"):
if not self.exists():
return []
sql = "select * from [{}]".format(self.name)
sql = "select {} from [{}]".format(select, self.name)
if where is not None:
sql += " where " + where
if order_by is not None:

View file

@ -26,7 +26,7 @@ def test_rows_where(where, where_args, expected_ids, fresh_db):
],
pk="id",
)
assert expected_ids == {r["id"] for r in table.rows_where(where, where_args)}
assert expected_ids == {r["id"] for r in table.rows_where(where, where_args, select="id")}
@pytest.mark.parametrize(