Skip to main content

Datastore framework implementation for umongo

Project description

μDatastore: ODM for Google Cloud Datastore

Implemented as framework in the μMongo library (a python ODM for MongoDB)

While working Google Cloud Datastore, most of our code uses the google-cloud-datastore package, for creating, updating and querying entities. We often find ourselves writing code to export objects to datastore.Entity, and import from entities to objects. On AppEngine, there is ndb which avoids this, so the idea emerged to create an ODM for datastore ourselves.

Having worked with μMongo before, a prototype was created which implements an additional framework based on following conventions:

  • A datastore partition (project/namespace) corresponds to a mongo database
  • A datastore entity kind corresponds to a mongo collection
  • The datastore __key__ field corresponds to the mongo _id field


pip install udatastore


from datetime import datetime
from import datastore
from udatastore import DataStoreInstance
from umongo import Document, fields, validate

db = datastore.Client(project="dummy", namespace='abcd')
instance = DataStoreInstance()

class User(Document):
    email = fields.EmailField(required=True, unique=True)
    birthday = fields.DateTimeField(validate=validate.Range(min=datetime(1900, 1, 1)))
    friends = fields.ListField(fields.ReferenceField("User"))

goku = User(email='', birthday=datetime(1984, 11, 20))
vegeta = User(email='', friends=[goku])

# <object umongo.data_objects.List([<object udatastore.reference.DataStoreReference(document=User, pk=<Key('User', 4476), project=dummy>)>])>
# {'email': '', 'id': '4477', 'friends': [<Key('User', 4476), project=dummy>]}
User.find_one({"email": ''})
# <object Document __main__.User({'email': '', 'id': 4474,
#                                 'friends': <object umongo.data_objects.List([])>,
#                                 'birthday': datetime.datetime(1984, 11, 20, 0, 0)})>


Not all features of μMongo are available or work exactly the same in μDatastore:

  • No indexes
  • We do not currently support all field types
  • Datastore converts any datetime to UTC timezone. For now, μDatastore overrides this behaviour and always works with unaware datetimes.
  • We bring our own ReferenceField implementation. You are free to use umongo.fields.ReferenceField, as the DataStoreBuilder will automatically replace these fields with our implementation. We also disable the io_validation on reference fields. Because datastore is eventually consistent this may report errors when creating references to previously created entities.

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 udatastore, version 0.1.3
Filename, size File type Python version Upload date Hashes
Filename, size udatastore-0.1.3-py2.py3-none-any.whl (17.5 kB) File type Wheel Python version py2.py3 Upload date Hashes View
Filename, size udatastore-0.1.3.tar.gz (9.7 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