Skip to main content

Persistent compressed expiring dict in Python, backed up by sqlite3 and pickle

Project description

A lightweight wrapper around Python’s sqlite3 database with a simple, Pythonic dict-like interface.

>>> from expiringsqlitedict import SqliteDict
>>> with SqliteDict('./my_db.sqlite') as mydict:
>>>     mydict['some_key'] = any_picklable_object
>>>     print mydict['some_key']  # prints the new value
>>>     for key, value in mydict.iteritems():
>>>         print key, value
>>>     print len(mydict) # etc... all dict functions work

Pickle is used internally by default to serialize the values, and zlib is used to optionally compress (on insertion, the value is compressed, and it’s stored compressed if the compressed value is smaller than uncompressed). Keys are arbitrary strings, values arbitrary pickle-able objects. This must be used within a context manager, and serialization can be overridden with your own. The database is wrapped with a transaction, and any exception thrown out of the context manager rolls back all changes.

This was forked off of sqlitedict in order to add auto-expiring functionality, and initially was quite similar to it. Version 2.0 splits of completely and takes the module into a complete rewrite, mostly to remove unnecesary Ptyhon 2 compatibility, simplify the API, completely enforce a context manager for typical cases, add full typing throughout, and use sqlite triggers for expiration cleanup.

This version also does not vacuum at all automatically. It did in previous versions, but this was kind of a silly behavior to put into the library itself. If you want your database file intermittently vacuumed, you should put such behavior into a crontab or use the sqlite3 module to do it yourself intermittently.

Features

  • Values can be any picklable objects

  • Support for access from multiple programs or threads, with locking fully managed by sqlite itself.

  • A very simple codebase that is easy to read, relying on sqlite for as much behavior as possible.

  • A simple autocommit wrapper (AutocommitSqliteDict), if you really can’t handle a context manager and need something that fully handles like a dict.

  • Support for custom serialization or compression:

    class JsonSerializer:
        @staticmethod
        def loads(data: sqlite3.Binary) -> Any:
            return json.loads(data)
        @staticmethod
        def dumps(value: Any) -> sqlite3.Binary:
            json.dumps(data)
    
    with SqliteDict('some.db', serializer=JsonSerializer()) as mydict:
        mydict['some_key'] = some_json_encodable_object
        print mydict['some_key']

Installation

The module has no dependencies beyond Python itself.

Install or upgrade with:

pip install expiringsqlitedict

or from the source tar.gz:

python setup.py install

This module is a single file, so you could also easily import the module in your own tree, if your workflow needs that.

Documentation

Standard Python document strings are inside the module:

>>> import expiringsqlitedict
>>> help(expiringsqlitedict)

For developers

Install:

# pip install nose
# pip install coverage

To perform all tests:

# make test-all

To perform all tests with coverage:

# make test-all-with-coverage

Comments, bug reports

expiringsqlitedict resides on github. You can file issues or pull requests there.


expiringsqlitedict is open source software released under the Apache 2.0 license. Copyright (c) 2011-2018 Radim Řehůřek and contributors. The changes in this fork copyright (c) 2018 Absolute Performance, Inc.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

expiringsqlitedict-2.0.0-py3-none-any.whl (9.9 kB view details)

Uploaded Python 3

File details

Details for the file expiringsqlitedict-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: expiringsqlitedict-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 9.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.9.5

File hashes

Hashes for expiringsqlitedict-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ddb884858b97bc92a7690fe65ace821fb6d3261a4084e4744e9edcea07900233
MD5 024b73c174c239162718b11b7cc71e13
BLAKE2b-256 4e94f3a3c8a303ef85fe5485db994515fae937abc30d941ac9835c06d745a92b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page