TinyDB is a tiny, document oriented database optimized for your happiness :)
Project description
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 + 2.7 and 3.3 – 3.6 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.
To dive straight into all the details, head over to the TinyDB docs. You can also discuss everything related to TinyDB like general development, extensions or showcase your TinyDB-based projects on the discussion forum.
Example Code
>>> from tinydb import TinyDB, Query
>>> db = TinyDB('/path/to/db.json')
>>> db.insert({'int': 1, 'char': 'a'})
>>> db.insert({'int': 1, 'char': 'b'})
Query Language
>>> 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)
Tables
>>> table = db.table('name')
>>> table.insert({'value': True})
>>> table.all()
[{'value': True}]
Using Middlewares
>>> from tinydb.storages import JSONStorage
>>> from tinydb.middlewares import CachingMiddleware
>>> db = TinyDB('/path/to/db.json', storage=CachingMiddleware(JSONStorage))
Supported Python Versions
TinyDB has been tested with Python 2.6, 2.7, 3.3 - 3.5 and PyPy.
Extensions
Contributing
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 ☺
Changelog
v3.6.0 (2017-10-05)
Allow updating all documents using db.update(fields) (see issue #157).
Rename elements to documents. Document IDs now available with doc.doc_id, using doc.eid is now deprecated (see pull request #158)
v3.5.0 (2017-08-30)
Expose the table name via table.name (see issue #147).
Allow better subclassing of the TinyDB class (see pull request #150).
v3.4.1 (2017-08-23)
Expose TinyDB version via import tinyb; tinydb.__version__ (see issue #148).
v3.4.0 (2017-08-08)
Add new update operations: add(key, value), substract(key, value), and set(key, value) (see pull request #145).
v3.3.1 (2017-06-27)
Use relative imports to allow vendoring TinyDB in other packages (see pull request #142).
v3.3.0 (2017-06-05)
Allow iterating over a database or table yielding all documents (see pull request #139).
v3.2.3 (2017-04-22)
Fix bug with accidental modifications to the query cache when modifying the list of search results (see issue #132).
v3.2.2 (2017-01-16)
Fix the Query constructor to prevent wrong usage (see issue #117).
v3.2.1 (2016-06-29)
Fix a bug with queries on documents that have a path key (see pull request #107).
Don’t write to the database file needlessly when opening the database (see pull request #104).
v3.2.0 (2016-04-25)
Add a way to specify the default table name via default_table (see pull request #98).
Add db.purge_table(name) to remove a single table (see pull request #100).
Along the way: celebrating 100 issues and pull requests! Thanks everyone for every single contribution!
Extend API documentation (see issue #96).
v3.1.3 (2016-02-14)
Fix a bug when that breaks the JSONStorage when the TinyDB instance gets garbagge collected (see issue #92).
v3.1.2 (2016-01-30)
Fix a bug when using unhashable documents (lists, dicts) with Query.any or Query.all queries (see a forum post by karibul).
v3.1.1 (2016-01-23)
v3.1.0 (2015-12-31)
v3.0.0 (2015-11-13)
Overhauled Query model:
where('...').contains('...') has been renamed to where('...').search('...').
Support for ORM-like usage: User = Query(); db.search(User.name == 'John').
where('foo') is an alias for Query().foo.
where('foo').has('bar') is replaced by either where('foo').bar or Query().foo.bar.
In case the key is not a valid Python identifier, array notation can be used: where('a.b.c') is now Query()['a.b.c'].
Checking for the existence of a key has to be done explicitely: where('foo').exists().
Migrations from v1 to v2 have been removed.
SmartCacheTable has been moved to msiemens/tinydb-smartcache.
Serialization has been moved to msiemens/tinydb-serialization.
Empty storages are now expected to return None instead of raising ValueError. (see issue #67.
v2.4.0 (2015-08-14)
Allow custom parameters for custom test functions (see issue #63 and pull request #64).
v2.3.2 (2015-05-20)
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).
v2.3.1 (2015-04-30)
Hopefully fix a problem with using TinyDB as a dependency in a setup.py script (see issue #51).
v2.3.0 (2015-04-08)
Added support for custom serialization. That way, you can teach TinyDB to store datetime objects 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
v2.2.2 (2015-02-12)
Fixed a data loss when using CachingMiddleware together with JSONStorage (see issue #47)
v2.2.1 (2015-01-09)
Fixed handling of IDs with the JSON backend that converted integers to strings (see issue #45)
v2.2.0 (2014-11-10)
Extended any and all 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 with JSONStorage (see pull request #39)
v2.1.0 (2014-10-14)
v2.0.1 (2014-09-22)
Fixed handling of Unicode data in Python 2 (see issue #28).
v2.0.0 (2014-09-05)
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, use db.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 and any comparisons on lists.
Added optional smart query caching.
The query cache is now a fixed size LRU cache.
v1.4.0 (2014-07-22)
Added insert_multiple function (see issue #8).
v1.3.0 (2014-07-02)
Fixed bug #7: IDs not unique.
Extended the API: db.count(where(...)) and db.contains(where(...)).
The syntax query in db is now deprecated and replaced by db.contains.
v1.2.0 (2014-06-19)
Added update method (see issue #6).
v1.1.1 (2014-06-14)
Merged PR #5: Fix minor documentation typos and style issues.
v1.1.0 (2014-05-06)
Improved the docs and fixed some typos.
Refactored some internal code.
Fixed a bug with multiple TinyDB? instances.
v1.0.1 (2014-04-26)
Fixed a bug in JSONStorage that broke the database when removing entries.
v1.0.0 (2013-07-20)
First official release – consider TinyDB stable now.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.