μMongo: sync/async ODM
μMongo is a Python MongoDB ODM. Its inception comes from two needs:
- The lack of async ODM
- The difficulty in doing document (un)serialization with existing ODMs.
From this point, μMongo made a few design choices:
- Stay close to the standards MongoDB driver to keep the same API when possible,
i.e., use
find({"field": "value"})
like usual but retrieve your data nicely OO wrapped! - Work with multiple drivers (PyMongo, TxMongo, motor_asyncio and mongomock for the moment)
- Tight integration with Marshmallow serialization library to easily dump and load your data with the outside world
- i18n integration to localize validation error messages
- Free software: MIT license
- Test with 90%+ coverage ;-)
Quick example
from datetime import datetime from pymongo import MongoClient from umongo import Instance, Document, fields, validate db = MongoClient().test instance = Instance(db) @instance.register 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")) class Meta: collection = db.user # Make sure that unique indexes are created User.ensure_indexes() goku = User(email='goku@sayen.com', birthday=datetime(1984, 11, 20)) goku.commit() vegeta = User(email='vegeta@over9000.com', friends=[goku]) vegeta.commit() vegeta.friends # <object umongo.data_objects.List([<object umongo.dal.pymongo.PyMongoReference(document=User, pk=ObjectId('5717568613adf27be6363f78'))>])> vegeta.dump() # {id': '570ddb311d41c89cabceeddc', 'email': 'vegeta@over9000.com', friends': ['570ddb2a1d41c89cabceeddb']} User.find_one({"email": 'goku@sayen.com'}) # <object Document __main__.User({'id': ObjectId('570ddb2a1d41c89cabceeddb'), 'friends': <object umongo.data_objects.List([])>, # 'email': 'goku@sayen.com', 'birthday': datetime.datetime(1984, 11, 20, 0, 0)})>
Get it now
$ pip install umongo # This installs umongo with pymongo $ pip install my-mongo-driver # Other MongoDB drivers must be installed manually
Or to get it along with the MongoDB driver you're planing to use::
$ pip install umongo[motor] $ pip install umongo[txmongo] $ pip install umongo[mongomock]