Skip to main content

SmartNinja Mongo - a simple MongoDB & TinyDB wrapper.

Project description

SmartNinja Mongo

A simple wrapper for MongoDB (pymongo) and TinyDB (tinymongo). It also provides a lightweight object-document mapper (ODM).

Use it if you don't want to (or can't) install MongoDB locally.

Installation

Install the package via pip:

pip install smartninja-mongo

Or add it in your requirements.txt and run pip install -r requirements.txt.

Dependencies

SmartNinja Mongo automatically installs the following dependencies:

  • tinymongo
  • pymongo
  • tinydb
  • tinydb_serialization (used to easily convert datetime objects)

How it works

You write your code as you would using the pymongo package. Except that you get the MongoClient class from the smartninja_mongo library (see examples below).

SmartNinja Mongo automatically figures out whether you're the program is running on localhost or on a production server.

If it's on localhost, TinyDB will be used instead of MongoDB via the tinymongo package (except if you set the CUSTOM_MONGO_SERVER env var).

If the app runs on Heroku or on Azure, the smartninja_mongo package automatically recognizes this and returns the pymongo client class instead of the one from tinymongo.

If your program runs in some other production environment, just set the CUSTOM_MONGO_SERVER env var (add any value to it that comes back as True, like for example "1") and pymongo client will be used.

Usage

SmartNinja Mongo's only task is to get you the right Mongo client:

from smartninja_mongo.connection import MongoClient

client = MongoClient('mongodb://ds012345.mlab.com:56789/')

If your Python program runs on Heroku (for example), you'll get back a MongoClient from the pymongo library which has a connection to the production MongoDB database (in this case the mLab's Mongo database).

But if your app runs on localhost, a TinyDB instance will be created (you'll see a localhost.db folder created, put it in .gitignore).

Even if TinyDB is used on localhost instead of the MongoDB, you can write your code in the MongoDB way (or pymongo way).

See the following examples:

db = client.my_database

collection = db.users

user_id = collection.insert_one({"first_name": "Matej", "last_name": "Ramuta", "year_born": 1987, "created": datetime.datetime.now()}).inserted_id

user_info = collection.find_one({"_id": user_id})

print(user_info)

More usage examples

For more usage examples see PyMongo docs: https://api.mongodb.com/python/current/.

Beware

There might be some incompatibilities between TinyMongo and PyMongo. Make sure to also check the TinyMongo docs to identify the problem if weird behavior occurs.

ODM

MongoDB accepts data as dictionaries and also returns data as dicts. If you'd like to use model classes in your project, you can use a base model from the SmartNinja Mongo library:

from smartninja_mongo.odm import Model


class User(Model):
    def __init__(self, first_name, **kwargs):
        self.first_name = first_name

        super().__init__(**kwargs)

Make sure to add **kwargs as a parameter and call super() at the end of the __init__ method.

Alternatively you can skip __init__ completely

class User(Model):
	pass

The benefit of using SmartNinja Mongo ODM Model

The main benefit is that you get a method called: convert_dict_to_object():

user_info = collection.find_one({"_id": user_id})

user_obj = User.convert_dict_to_object(data_dict=user_info)

print(user_obj.first_name)

This Model class provides a very lightweight and simple object-document mapping (ODM).

Contributions

Contributions via pull requests are warmly welcome!

TODO

  • tests
  • CI

Project details


Download files

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

Source Distribution

smartninja-mongo-0.5.tar.gz (3.8 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page