Shelve extension

A storage/query backend for shelve which is bundled with Python.

status:stable
database:any dbm-style database supported by shelve
dependencies:the Python standard library
suitable for:“smart” interface to a key/value store, small volume

A “shelf” is a persistent, dictionary-like object. The difference with “dbm” databases is that the values (not the keys!) in a shelf can be essentially arbitrary Python objects — anything that the pickle module can handle. This includes most class instances, recursive data types, and objects containing lots of shared sub-objects. The keys are ordinary strings.

This extension wraps the standard Python library and provides Document support and uniform query API.

Note

The query methods are inefficient as they involve iterating over the full set of records and making per-row comparison without indexing. This backend is not suitable for applications that depend on queries and require decent speed. However, it is an excellent tool for existing DBM databases or for environments and cases where external dependencies are not desired.

class doqu.ext.shelve_db.StorageAdapter(**kw)
Parameters:
  • path – relative or absolute path to the database file (e.g. test.db)
clear()

Clears the whole storage from data.

connect()

Connects to the database. Raises RuntimeError if the connection is not closed yet. Use StorageAdapter.reconnect() to explicitly close the connection and open it again.

delete(primary_key)

Permanently deletes the record with given primary key from the database.

disconnect()

Writes the data into the file, closes the file and deletes the connection.

get(model, primary_key)

Returns model instance for given model and primary key.

get_many(doc_class, primary_keys)

Returns a list of documents with primary keys from given list. Basically this is just a simple wrapper around get() but some backends can reimplement the method in a much more efficient way.

get_or_create(doc_class, **kwargs)

Queries the database for records associated with given document class and conforming to given extra condtions. If such records exist, picks the first one (the order may be random depending on the database). If there are no such records, creates one.

Returns the document instance and a boolean value “created”.

reconnect()

Gracefully closes current connection (if it’s not broken) and connects again to the database (e.g. reopens the file).

save(data, primary_key=None, sync=False)

Saves given model instance into the storage. Returns primary key.

Parameters:
  • data – dict containing all properties to be saved
  • primary_key – the key for given object; if undefined, will be generated
  • sync – if True, the storage is synchronized to disk immediately. This slows down bulk operations but ensures that the data is stored no matter what happens. Normally the data is synchronized on exit.

Note that you must provide current primary key for a model instance which is already in the database in order to update it instead of copying it.

class doqu.ext.shelve_db.QueryAdapter(*args, **kw)

The Query class.

count()

Same as __len__ but a bit faster.

delete()

Deletes all records that match current query. Iterates the whole set of records.

order_by(names, reverse=False)

Defines order in which results should be retrieved.

Parameters:
  • names – the names of columns by which the ordering should be done. Can be an iterable with strings or a single string.
  • reverse – If True, direction changes from ascending (default) to descending.

Examples:

q.order_by('name')                  # ascending
q.order_by('name', reverse=True)    # descending

If multiple names are provided, grouping is done from left to right.

Note

while you can specify the direction of sorting, it is not possible to do it on per-name basis due to backend limitations.

Warning

ordering implementation for this database is currently inefficient.

values(name)

Returns an iterator that yields distinct values for given column name.

Supports date parts (i.e. date__month=7).

Note

this is currently highly inefficient because the underlying library does not support columns mode (tctdbiternext3). Moreover, even current implementation can be optimized by removing the overhead of creating full-blown document objects.

Note

unhashable values (like lists) are silently ignored.

where(**conditions)

Returns Query instance filtered by given conditions. The conditions are defined exactly as in Pyrant’s high-level query API. See pyrant.query.Query.filter documentation for details.

where_not(**conditions)

Returns Query instance. Inverted version of where().

Previous topic

Extensions

Next topic

Shove extension

This Page