diff --git a/docs/getting-started.rst b/docs/getting-started.rst index aa04408e..9db3a7c4 100644 --- a/docs/getting-started.rst +++ b/docs/getting-started.rst @@ -40,6 +40,13 @@ Now you can get all elements stored in the database by running: >>> db.all() [{'count': 7, 'type': 'apple'}, {'count': 3, 'type': 'peach'}] +You can also iter over stored elements: + +>>> for item in db: +>>> print(item) +{'count': 7, 'type': 'apple'} +{'count': 3, 'type': 'peach'} + Of course you'll also want to search for specific elements. Let's try: >>> Fruit = Query() @@ -83,6 +90,8 @@ Before we dive deeper, let's recapitulate the basics: +-------------------------------+---------------------------------------------------------------+ | ``db.all()`` | Get all elements | +-------------------------------+---------------------------------------------------------------+ +| ``iter(db)`` | Iter over all elements | ++-------------------------------+---------------------------------------------------------------+ | ``db.search(query)`` | Get a list of elements matching the query | +-------------------------------+---------------------------------------------------------------+ | **Updating** | diff --git a/docs/usage.rst b/docs/usage.rst index 4a175f67..fb3c9246 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -339,6 +339,9 @@ the ``TinyDB`` class. To create and use a table, use ``db.table(name)``. >>> table.insert({'value': True}) >>> table.all() [{'value': True}] +>>> for row in table: +>>> print(row) +{'value': True} To remove a table from a database, use: diff --git a/tests/test_tables.py b/tests/test_tables.py index 8f8f9999..37d95a54 100644 --- a/tests/test_tables.py +++ b/tests/test_tables.py @@ -74,3 +74,11 @@ def test_lru_cache(db): assert len(table._query_cache) == 1 table.clear_cache() assert len(table._query_cache) == 0 + + +def test_table_is_iterable(db): + table = db.table('table1') + + table.insert_multiple({'int': i} for i in range(3)) + + assert [r for r in table] == table.all() diff --git a/tests/test_tinydb.py b/tests/test_tinydb.py index 23abf72e..5616cc96 100644 --- a/tests/test_tinydb.py +++ b/tests/test_tinydb.py @@ -472,3 +472,7 @@ def test_query_cache(): results.extend([1]) assert db.search(query) == [{'name': 'foo', 'value': 42}] + + +def test_tinydb_is_iterable(db): + assert [r for r in db] == db.all() diff --git a/tinydb/database.py b/tinydb/database.py index b19a6b3a..e7a8a751 100644 --- a/tinydb/database.py +++ b/tinydb/database.py @@ -110,7 +110,7 @@ def table(self, name=DEFAULT_TABLE, **options): table = self.table_class(StorageProxy(self._storage, name), **options) self._table_cache[name] = table - + # table._read will create an empty table in the storage, if necessary table._read() @@ -181,6 +181,12 @@ def __len__(self): """ return len(self._table) + def __iter__(self): + """ + Iter over all elements from default table. + """ + return self._table.__iter__() + class Table(object): """ @@ -303,6 +309,17 @@ def all(self): return list(itervalues(self._read())) + def __iter__(self): + """ + Iter over all elements stored in the table. + + :returns: an iterator over all elements. + :rtype: listiterator[Element] + """ + + for value in itervalues(self._read()): + yield value + def insert(self, element): """ Insert a new element into the table.