TinyDB is a lightweight document oriented database optimized for your happiness :) It's written in pure Python and has no external dependencies. 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 1000 lines tests. For comparison: Buzhug has about 2500 lines of code (w/o tests), CodernityDB has about 7000 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.5 and PyPy: TinyDB works on all modern versions of Python and PyPy.
- powerfully extensible: You can easily extend TinyDB by writing new storages or modify the behaviour of storages with Middlewares.
- 100% test coverage: No explanation needed.
>>> from tinydb import TinyDB, where
>>> db = TinyDB('/path/to/db.json')
>>> db.insert({'int': 1, 'char': 'a'})
>>> db.insert({'int': 1, 'char': 'b'})>>> User = Query()
>>> # Search for a field value
>>> db.search(User.name == 'John')
[{'name': 'John', 'age': 22}, {'name': 'John', 'age': 37}]
>>> # Combine two queries with logical and
>>> db.search((User.name == 'John') & (User.age <= 30))
[{'name': 'John', 'age': 22}]
>>> # Combine two queries with logical or
>>> db.search((User.name == 'John') | (User.name == 'Bob'))
[{'name': 'John', 'age': 22}, {'name': 'John', 'age': 37}, {'name': 'Bob', 'age': 42}]
>>> # 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.5 and PyPy.
tinyrecordtinyindexWhether 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 ☺
- Overhauled Query model:
where('...').contains('...')has been renamed towhere('...').search('...').- Support for ORM-like usage:
User = Query(); db.find(User.name == 'John'). where('foo')is an alias forQuery().foo.where('foo').has('bar')is replaced by eitherwhere('foo').barorQuery().foo.bar.- In case the key is not a valid Python identifier, array
notation can be used:
where('a.b.c')is nowQuery()['a.b.c'].
- In case the key is not a valid Python identifier, array
notation can be used:
- Checking for the existence of a key has to be done explicitely:
where('foo').exists().
- Migrations from v1 to v2 have been removed.
SmartCacheTablehas been moved to msiemens/tinydb-smartcache.- Serialization has been moved to msiemens/tinydb-serialization.
- Empty storages are now expected to return
Noneinstead of raisingValueError. (see issue #67.
- Allow custom parameters for custom test functions (see issue #63 and pull request #64).
- Fix a forgotten debug output in the
SerializationMiddleware(see issue #55). - Fix an "ignored exception" warning when using the
CachingMiddleware(see pull request #54) - Fix a problem with symlinks when checking out TinyDB on OSX Yosemite (see issue #52).
- Hopefully fix a problem with using TinyDB as a dependency in a
setup.pyscript (see issue #51).
- Added support for custom serialization. That way, you can teach TinyDB
to store
datetimeobjects in a JSON file :) (see issue #48 and pull request #50) - Fixed a performance regression when searching became slower with every search (see issue #49)
- Internal code has been cleaned up
- Fixed a data loss when using
CachingMiddlewaretogether withJSONStorage(see issue #47)
- Fixed handling of IDs with the JSON backend that converted integers to strings (see issue #45)
- Extended
anyandallqueries to take lists as conditions (see pull request #38) - Fixed an
decode errorwhen installing TinyDB in a non-UTF-8 environment (see pull request #37) - Fixed some issues with
CachingMiddlewarein 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 dbhas been removed, usedb.containsinstead. - The
ConcurrencyMiddlewarehas 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
allandanycomparisons on lists. - Added optional smart query caching.
- The query cache is now a fixed size LRU cache.
- Added
insert_multiplefunction (see issue #8).
- Fixed bug #7: IDs not unique.
- Extended the API:
db.count(where(...))anddb.contains(where(...)). - The syntax
query in dbis now deprecated and replaced bydb.contains.
- Added
updatemethod (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
JSONStoragethat broke the database when removing entries.
- First official release – consider TinyDB stable now.
