Version Numbering

TinyDB follows the SemVer versioning guidelines. For more information, see


When new methods are added to the Query API, this may result in breaking existing code that uses the property syntax to access document fields (e.g. Query().some.nested.field) where the field name is equal to the newly added query method. Thus, breaking changes may occur in feature releases even though they don’t change the public API in a backwards-incompatible manner.

To prevent this from happening, one can use the dict access syntax (Query()['some']['nested']['field']) that will not break even when new methods are added to the Query API.


  • nothing yet

v4.8.0 (2023-06-12)

  • Feature: Allow retrieve multiple documents by document ID using Table.get(doc_ids=[...]) (see pull request 504).

v4.7.1 (2023-01-14)

v4.7.0 (2022-02-19)

  • Feature: Allow inserting Document instances using Table.insert_multiple (see pull request 455).
  • Performance: Only convert document IDs of a table when returning documents. This improves performance the Table.count and Table.get operations and also for when only returning a few documents (see pull request 460).
  • Internal change: Run all Table tests JSONStorage in addition to MemoryStorage.

v4.6.1 (2022-01-18)

  • Fix: Make using callables as queries work again (see issue 454)

v4.6.0 (2022-01-17)

v4.5.2 (2021-09-23)

  • Fix: Make Table.delete()’s argument priorities consistent with other table methods. This means that if you pass both cond as well as doc_ids to Table.delete(), the latter will be preferred (see issue 424)

v4.5.1 (2021-07-17)

  • Fix: Correctly install typing-extensions on Python 3.7 (see issue 413)

v4.5.0 (2021-06-25)

  • Feature: Better type hinting/IntelliSense for PyCharm, VS Code and MyPy (see issue 372). PyCharm and VS Code should work out of the box, for MyPy see MyPy Type Checking

v4.4.0 (2021-02-11)

  • Feature: Add operation for searching for all documents that match a dict fragment (see issue 300)
  • Fix: Correctly handle queries that use fields that are also Query methods, e.g. Query()['test'] for searching for documents with a test field (see issue 373)

v4.3.0 (2020-11-14)

  • Feature: Add operation for updating multiple documents: update_multiple (see issue 346)
  • Improvement: Expose type information for MyPy typechecking (PEP 561) (see pull request 352)

v4.2.0 (2020-10-03)

  • Feature: Add support for specifying document IDs during insertion (see issue 303)
  • Internal change: Use OrderedDict.move_to_end() in the query cache (see issue 338)

v4.1.1 (2020-05-08)

  • Fix: Don’t install dev-dependencies when installing from PyPI (see issue 315)

v4.1.0 (2020-05-07)

  • Feature: Add a no-op query Query().noop() (see issue 313)
  • Feature: Add a access_mode flag to JSONStorage to allow opening files read-only (see issue 297)
  • Fix: Don’t drop the first document that’s being inserted when inserting data on an existing database (see issue 314)

v4.0.0 (2020-05-02)

Upgrade Notes

Breaking Changes

  • Python 2 support has been removed, see issue 284 for background

  • API changes:

    • Removed classes: DataProxy, StorageProxy

    • Attributes removed from TinyDB in favor of customizing TinyDB’s behavior by subclassing it and overloading __init__(...) and table(...):

    • Arguments removed from TinyDB(...):

      • default_table: replace with TinyDB.default_table_name = 'name'
      • table_class: replace with TinyDB.table_class = Class
    • TinyDB.contains(...)’s doc_ids parameter has been renamed to doc_id and now only takes a single document ID

    • TinyDB.purge_tables(...) has been renamed to TinyDB.drop_tables(...)

    • TinyDB.purge_table(...) has been renamed to TinyDB.drop_table(...)

    • TinyDB.write_back(...) has been removed

    • TinyDB.process_elements(...) has been removed

    • Table.purge() has been renamed to Table.truncate()

    • Evaluating an empty Query() without any test operators will now result in an exception, use Query().noop() (introduced in v4.1.0) instead

  • ujson support has been removed, see issue 263 and issue 306 for background

  • The deprecated Element ID API has been removed (e.g. using the Element class or eids parameter) in favor the Document API, see pull request 158 for details on the replacement


  • TinyDB’s internal architecture has been reworked to be more simple and streamlined in order to make it easier to customize TinyDB’s behavior
  • With the new architecture, TinyDB performance will improve for many applications


  • Don’t break the tests when ujson is installed (see issue 262)
  • Fix performance when reading data (see issue 250)
  • Fix inconsistent purge function names (see issue 103)

v3.15.1 (2019-10-26)

  • Internal change: fix missing values handling for LRUCache

v3.15.0 (2019-10-12)

  • Feature: allow setting the parameters of TinyDB’s default table (see issue 278)

v3.14.2 (2019-09-13)

  • Internal change: support correct iteration for LRUCache objects

v3.14.1 (2019-07-03)

  • Internal change: fix Query class to permit subclass creation (see pull request 270)

v3.14.0 (2019-06-18)

  • Change: support for ujson is now deprecated (see issue 263)

v3.13.0 (2019-03-16)

  • Feature: direct access to a TinyDB instance’s storage (see issue 258)

v3.12.2 (2018-12-12)

v3.12.1 (2018-11-09)

  • Fix: Don’t break when searching the same query multiple times (see pull request 249)
  • Internal change: allow as valid document types (see pull request 245)

v3.12.0 (2018-11-06)

  • Feature: Add encoding option to JSONStorage (see pull request 238)
  • Internal change: allow as valid document types (see pull request 245)

v3.11.1 (2018-09-13)

  • Bugfix: Make path queries ('key))) work again (see issue 232)
  • Improvement: Add custom repr representations for main classes (see pull request 229)

v3.11.0 (2018-08-20)

  • Drop official support for Python 3.3. Python 3.3 has reached its official End Of Life as of September 29, 2017. It will probably continue to work, but will not be tested against (issue 217)
  • Feature: Allow extending TinyDB with a custom storage proxy class (see pull request 224)
  • Bugfix: Return list of document IDs for upsert when creating a new document (see issue 223)

v3.10.0 (2018-07-21)

v3.9.0 (2018-04-24)

  • Feature: Allow setting a table class for single table only (see issue 197)
  • Internal change: call fsync after flushing JSONStorage (see issue 208)

v3.8.1 (2018-03-26)

v3.8.0 (2018-03-01)

  • Feature: Allow disabling the query cache with db.table(name, cache_size=0) (see pull request #187)
  • Feature: Add db.write_back(docs) for replacing documents (see pull request #184)

v3.7.0 (2017-11-11)

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)

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), subtract(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 using unhashable documents (lists, dicts) with Query.any or Query.all queries (see a forum post by karibul).

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)

  • Inserting a dictionary with data that is not JSON serializable doesn’t lead to corrupt files anymore (see issue #89).
  • Fix a bug in the LRU cache that may lead to an invalid query cache (see issue #87).

v3.1.0 (2015-12-31)

  • db.update(...) and db.remove(...) now return affected document IDs (see issue #83).
  • Inserting an invalid document (i.e. not a dict) now raises an error instead of corrupting the database (see issue #74).

v3.0.0 (2015-11-13)

  • Overhauled Query model:
    • where('...').contains('...') has been renamed to where('...').search('...').
    • Support for ORM-like usage: User = Query(); == 'John').
    • where('foo') is an alias for Query().foo.
    • where('foo').has('bar') is replaced by either where('foo').bar or Query()
      • 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 explicitly: 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)

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 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)

  • Added where(...).contains(regex) (see issue #32)
  • Fixed a bug that corrupted data after reopening a database (see issue #34)

v2.0.1 (2014-09-22)

  • Fixed handling of Unicode data in Python 2 (see issue #28).

v2.0.0 (2014-09-05)

Upgrade Notes


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.

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)

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.

« Contribution Guidelines | Upgrading to Newer Releases »