A lightweight wrapper around Python's sqlite3 database with a simple, Pythonic dict-like interface and support for multi-thread access:
>>> from sqlitedict import SqliteDict
>>> mydict = SqliteDict('./my_db.sqlite', autocommit=True)
>>> 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
>>> mydict.close()
Pickle is used internally to (de)serialize the values. Keys are arbitrary strings, values arbitrary pickle-able objects.
If you don't use autocommit (default is no autocommit for performance), then
don't forget to call mydict.commit()
when done with a transaction:
>>> # using SqliteDict as context manager works too (RECOMMENDED)
>>> with SqliteDict('./my_db.sqlite') as mydict: # note no autocommit=True
... mydict['some_key'] = u"first value"
... mydict['another_key'] = range(10)
... mydict.commit()
... mydict['some_key'] = u"new value"
... # no explicit commit here
>>> with SqliteDict('./my_db.sqlite') as mydict: # re-open the same DB
... print mydict['some_key'] # outputs 'first value', not 'new value'
- Values can be any picklable objects (uses
cPickle
with the highest protocol). - Support for multiple tables (=dicts) living in the same database file.
- Support for access from multiple threads to the same connection (needed by e.g. Pyro).
Vanilla sqlite3 gives you
ProgrammingError: SQLite objects created in a thread can only be used in that same thread.
Concurrent requests are still serialized internally, so this "multithreaded support" doesn't give you any performance benefits. It is a work-around for sqlite limitations in Python.
The module has no dependencies beyond Python itself. The minimum Python version is 2.5, continuously tested on Python 2.6, 2.7, 3.3 and 3.4 on Travis.
Install or upgrade with:
easy_install -U sqlitedict
or from the source tar.gz:
python setup.py install
Standard Python document strings are inside the module:
>>> import sqlitedict
>>> help(sqlitedict)
(but it's just dict
with a commit, really).
Beware: because of Python semantics, sqlitedict
cannot know when a mutable
SqliteDict-backed entry was modified in RAM. For example, mydict.setdefault('new_key', []).append(1)
will leave mydict['new_key']
equal to empty list, not [1]
. You'll need to
explicitly assign the mutated object back to SqliteDict to achieve the same effect:
>>> val = mydict.get('new_key', [])
>>> val.append(1) # sqlite DB not updated here!
>>> mydict['new_key'] = val # now updated
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
sqlitedict
resides on github. You can file
issues or pull requests there.
1.4.0: fix regression where iterating over keys/values/items returned a full list instead of iterator
1.3.0: improve error handling in multithreading (PR #28); 100% test coverage.
1.2.0: full python 3 support, continuous testing via Travis CI.
sqlitedict
is open source software released under the Apache 2.0 license.
Copyright (c) 2011-now Radim Řehůřek and contributors.