From 71782311ce5a4535a0820c7a55fc813e6a12ae16 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 22 Sep 2020 16:10:14 -0700 Subject: [PATCH] New .rows_where(select=) argument --- docs/python-api.rst | 9 ++++++++- sqlite_utils/db.py | 4 ++-- tests/test_rows.py | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/python-api.rst b/docs/python-api.rst index 35023d5..4041d4d 100644 --- a/docs/python-api.rst +++ b/docs/python-api.rst @@ -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"): diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 33af372..6ba718a 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -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: diff --git a/tests/test_rows.py b/tests/test_rows.py index 539d71d..8885802 100644 --- a/tests/test_rows.py +++ b/tests/test_rows.py @@ -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(