TinyDB is a tiny, document oriented database optimized for your happiness :) It's written in pure Python and has no external requirements. The target are small apps that would be blown away by a SQL-DB or an external database server.
TinyDB is:
- tiny: The current source code has 1200 lines of code (with about 40% documentation) and 600 lines tests. For comparison: Buzhug has about 2000 lines of code (w/o tests), CodernityDB has about 8000 lines of code (w/o tests).
- document oriented: Like MongoDB, you can store any document
(represented as
dict
) in TinyDB. - optimized for your happiness: TinyDB is designed to be simple and fun to use by providing a simple and clean API.
- written in pure Python: TinyDB neither needs an external server (as e.g. PyMongo) nor any dependencies from PyPI.
- works on Python 2.6 – 3.4 and PyPy: TinyDB works on all modern versions of Python and PyPy.
- easily extensible: You can easily extend TinyDB by writing new storages or modify the behaviour of storages with Middlewares.
- nearly 100% test coverage: If you don't count that
__repr__
methods and some abstract methods are not tested, TinyDB has a test coverage of 100%.
>>> from tinydb import TinyDB, where
>>> db = TinyDB('/path/to/db.json')
>>> db.insert({'int': 1, 'char': 'a'})
>>> db.insert({'int': 1, 'char': 'b'})
>>> # Search for a field value
>>> db.search(where('int') == 1)
[{'int': 1, 'char': 'a'}, {'int': 1, 'char': 'b'}]
>>> # Combine two queries with logical and
>>> db.search((where('int') == 1) & (where('char') == 'b'))
[{'int': 1, 'char': 'b'}]
>>> # Combine two queries with logical or
>>> db.search((where('char') == 'a') | (where('char') == 'b'))
[{'int': 1, 'char': 'a'}, {'int': 1, 'char': 'b'}]
>>> # More possible comparisons: != < > <= >=
>>> # More possible checks: where(...).matches(regex), where(...).test(your_test_func)
>>> table = db.table('name')
>>> table.insert({'value': True})
>>> table.all()
[{'value': True}]
>>> from tinydb.storages import JSONStorage
>>> from tinydb.middlewares import CachingMiddleware
>>> db = TinyDB('/path/to/db.json', storage=CachingMiddleware(JSONStorage))
The documentation for TinyDB is hosted at Read the Docs
: https://tinydb.readthedocs.org/
TinyDB has been tested with Python 2.6, 2.7, 3.2, 3.3, 3.4 and pypy.
Name:
tinyrecord
Status: experimental
Description: Tinyrecord is a library which implements experimental atomic
transaction support for the TinyDB NoSQL database. It uses a
record-first then execute architecture which allows us to
minimize the time that we are within a thread lock.
Name:
tinyindex
Status: experimental
Description: Document indexing for TinyDB. Basically ensures deterministic
(as long as there aren't any changes to the table) yielding
of documents.
Whether reporting bugs, discussing improvements and new ideas or writing extensions: Contributions to TinyDB are welcome! Here's how to get started:
- Check for open issues or open a fresh issue to start a discussion around a feature idea or a bug
- Fork the repository on Github, create a new branch off the master branch and start making your changes (known as GitHub Flow)
- Write a test which shows that the bug was fixed or that the feature works as expected
- Send a pull request and bug the maintainer until it gets merged and published ☺
- Extended
any
andall
queries to take lists as conditions (see pull request #38) - Fixed an
decode error
when installing TinyDB in a non-UTF-8 environment (see pull request #37) - Fixed some issues with
CachingMiddleware
in combination withJSONStorage
(see pull request #39)
- Added
where(...).contains(regex)
(see issue #32) - Fixed a bug that corrupted data after reopening a database (see issue #34)
- Fixed handling of unicode data in Python 2 (see issue #28).
Warning: TinyDB changed the way data is stored. You may need to migrate your databases to the new scheme. Check out the Upgrade Notes for details.
- The syntax
query in db
has been removed, usedb.contains
instead. - The
ConcurrencyMiddleware
has been removed due to a insecure implementation (see Issue #18). Consider tinyrecord instead. - Better support for working with Element IDs.
- Added support for nested comparisons.
- Added
all
andany
comparisons on lists. - Added optional smart query caching.
- The query cache is now a fixed size lru cache.
- Added
insert_multiple
function (see issue #8).
- Fixed bug #7: IDs not unique.
- Extended the API:
db.count(where(...))
anddb.contains(where(...))
. - The syntax
query in db
is now deprecated and replaced bydb.contains
.
- Added
update
method (see issue #6).
- Merged PR #5: Fix minor documentation typos and style issues.
- Improved the docs and fixed some typos.
- Refactored some internal code.
- Fixed a bug with multiple
TinyDB?
instances.
- Fixed a bug in
JSONStorage
that broke the database when removing entries.
- First official release – consider TinyDB stable now.