Added db[table].rows iterator

This commit is contained in:
Simon Willison 2019-02-21 21:29:50 -08:00
commit 3095f2e671
3 changed files with 26 additions and 0 deletions

View file

@ -52,6 +52,17 @@ You can also iterate through the table objects themselves using the ``.tables``
>>> db.tables
[<Table dogs>]
Listing rows
============
To iterate through dictionaries for each of the rows in a table, use ``.rows``::
>>> db = sqlite_utils.Database("dogs.db")
>>> for row in db["dogs"].rows:
... print(row)
{'id': 1, 'age': 4, 'name': 'Cleo'}
{'id': 2, 'age': 2, 'name': 'Pancakes'}
Creating tables
===============

View file

@ -134,6 +134,15 @@ class Table:
).fetchall()
return [Column(*row) for row in rows]
@property
def rows(self):
if not self.exists:
return []
cursor = self.db.conn.execute("select * from [{}]".format(self.name))
columns = [c[0] for c in cursor.description]
for row in cursor:
yield dict(zip(columns, row))
@property
def pks(self):
return [column.name for column in self.columns if column.is_pk]

View file

@ -46,6 +46,12 @@ def test_columns(existing_db):
]
def test_rows(existing_db):
assert [{"text": "one"}, {"text": "two"}, {"text": "three"}] == list(
existing_db["foo"].rows
)
def test_schema(existing_db):
assert "CREATE TABLE foo (text TEXT)" == existing_db["foo"].schema