From f70e35c9bbc0d5803bc0aee572b894a8b21ac41e Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 14 Jul 2019 11:58:40 -0700 Subject: [PATCH] Added table.rows_where(where, args) method --- docs/python-api.rst | 7 +++++++ sqlite_utils/db.py | 8 +++++++- tests/test_get.py | 22 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 tests/test_get.py diff --git a/docs/python-api.rst b/docs/python-api.rst index 210939f..0cc5007 100644 --- a/docs/python-api.rst +++ b/docs/python-api.rst @@ -65,6 +65,13 @@ To iterate through dictionaries for each of the rows in a table, use ``.rows``:: {'id': 1, 'age': 4, 'name': 'Cleo'} {'id': 2, 'age': 2, 'name': 'Pancakes'} +You can filter rows by a WHERE clause using ``.rows_where(where, where_args)``:: + + >>> db = sqlite_utils.Database("dogs.db") + >>> for row in db["dogs"].rows_where("age > ?", [3]): + ... print(row) + {'id': 1, 'age': 4, 'name': 'Cleo'} + Creating tables =============== diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 3a44cb4..9b179ac 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -365,9 +365,15 @@ class Table: @property def rows(self): + return self.rows_where() + + def rows_where(self, where=None, where_args=None): if not self.exists: return [] - cursor = self.db.conn.execute("select * from [{}]".format(self.name)) + sql = "select * from [{}]".format(self.name) + if where is not None: + sql += " where " + where + cursor = self.db.conn.execute(sql, where_args or []) columns = [c[0] for c in cursor.description] for row in cursor: yield dict(zip(columns, row)) diff --git a/tests/test_get.py b/tests/test_get.py new file mode 100644 index 0000000..75ddaef --- /dev/null +++ b/tests/test_get.py @@ -0,0 +1,22 @@ +import pytest + + +@pytest.mark.parametrize( + "where,where_args,expected_ids", + [ + ("name = ?", ["Pancakes"], {2}), + ("age > ?", [3], {1}), + ("name is not null", [], {1, 2}), + ("is_good = ?", [True], {1, 2}), + ], +) +def test_rows_where(where, where_args, expected_ids, fresh_db): + table = fresh_db["dogs"] + table.insert_all( + [ + {"id": 1, "name": "Cleo", "age": 4, "is_good": True}, + {"id": 2, "name": "Pancakes", "age": 3, "is_good": True}, + ], + pk="id", + ) + assert expected_ids == {r["id"] for r in table.rows_where(where, where_args)}