Skip to main content

A light and predictable Redis object mapper

Project description

A library for light and predictable python object mappings to Redis

Documentation Status

Documentation

Documentation is generated through sphinx and hosted at Read the Docs!

Why did you build this?

I wanted an object oriented way to interact with redis that would provide exacting control over database layout, predicatble and fast queries, and good documentation. (hopefully I got that last one right, but I’m not the one to judge)

The first goal of trol is a statically defined, human-readble database structure defined by python classes. This allows the dev to look at the database at runtime and read it as easily as the code which defined it. The dev should be able to modify the database and know exactly what effect it will have on the program. As a result of this, trol explicitly does not provide indexing or store supporting datastructures not defined by the programer.

The second goal of trol is fast and predictable querying. Any python access, function, or modification should result and in one or zero network transfers. One result of this is a structure which encourages the dev to create a database where eveything is defined in location and uniquely identifieable without searching.

Getting started

pip install trol and start defining your schema:

>>> import trol
>>> import redis
...
>>> class MyDatabase(trol.Database):
...   redis = redis.Redis()
...
...   favorite_breweries = trol.SortedSet('favbreweries', typ=trol.Model)
...
...   class Brewery(trol.Model):
...     def __init__(self, short_name):
...       self.id = short_name
...
...     location = trol.Property()
...     name = trol.Property(typ=str)
...     beers = trol.Set(typ=trol.Model)
...
...   class Beer(trol.Model):
...     def __init__(self, name, batch_number):
...       self.name = name
...       self.batch_number = batch_number
...
...     @property
...     def id(self):
...       return self.name + '@' + str(self.batch_number)
...
...     style = trol.Property()
...     rating = trol.Property(typ=int)
...
>>> brewery = MyDatabase.Brewery('frmt')
>>> brewery.location = (47.6490476, -122.3467747)
>>> brewery.name = "Fremont Brewing Company"
>>> lush = MyDatabase.Beer('Lush IPA', 120)
>>> lush.style = "Indian Pale Ale"
>>> lush.rating = 5
>>> universale = MyDatabase.Beer('Universale', 245)
>>> universale.style = "American Pale Ale"
>>> universale.rating = 5
>>> brewery.beers.add(lush, universale)
2
>>> MyDatabase.favorite_breweries.add(brewery, 10)
1
>>> set(MyDatabase.redis.keys()) == {
...   b'favbreweries',
...   b'Brewery:frmt:name',
...   b'Brewery:frmt:location',
...   b'Brewery:frmt:beers',
...   b'Beer:Lush IPA@120:style',
...   b'Beer:Lush IPA@120:rating',
...   b'Beer:Universale@245:style',
...   b'Beer:Universale@245:rating'
... }
True

Project details


Download files

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

Files for trol, version 0.5.1
Filename, size File type Python version Upload date Hashes
Filename, size trol-0.5.1-py3-none-any.whl (23.8 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size trol-0.5.1.tar.gz (24.9 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page