Skip to main content

A serverless Mongo-like database backed with SQLite.

Project description

drawing

Monty, Mongo tinified. A literally serverless, Mongo-like database in Python

Build Status Coverage Status Version Maintainability

:construction: Not Ready For Prime Time :construction:

Inspired by TinyDB and the extension TinyMongo.

MontyDB is:

  • A serverless version of MongoDB, against to MongoDB 3.6.4
  • Document oriented, of course
  • Storage engine pluggable
  • Write in pure Python, works on Python 2.7, 3.4, 3.5, 3.6

Install

pip install montydb

Requirements
  • pyyaml
  • jsonschema
  • pymongo (for bson)

Example Code

>>> from montydb import MontyClient
>>> col = MontyClient(":memory:").db.test
>>> col.insert_many([{"stock": "A", "qty": 6}, {"stock": "A", "qty": 2}])

>>> cur = col.find({"stock": "A", "qty": {"$gt": 4}})
>>> next(cur)
{'_id': ObjectId('5ad34e537e8dd45d9c61a456'), 'stock': 'A', 'qty': 6}

Develop Status

See Projects' TODO

Storage Engine Configurations

The configuration process only required on repository creation or modification.

Currently, one repository can only assign one storage engine.

  • Memory

Memory storage does not need nor have any configuration, nothing saved to disk.

>>> client = MontyClient(":memory:")
  • SQLite

SQLite is the default on-disk storage engine, you can skip the configuration if the default setting is okay.

>>> client = MontyClient("/db/repo")

SQLite default settings, they are infact SQLite pragmas:

connection:
  journal_mode: WAL
write_concern:
  synchronous: 1
  automatic_index: OFF
  busy_timeout: 5000

If you are not happy with the default, use MontyConfigure before get client.

>>> from montydb import MontyClient, MontyConfigure, storage
>>> with MontyConfigure("/db/repo") as cf:  # Auto save config when exit
...     cf.load(storage.SQLiteConfig)       # Load sqlite config
...     cf.config.connection.journal_mode = "DELETE"
...     cf.config.write_concern.busy_timeout = 8000
...
>>> client = MontyClient("/db/repo")  # Running tweaked sqlite storage now
  • FlatFile

Not default storage engine, need configuration first before get client.

>>> from montydb import MontyClient, MontyConfigure, storage
>>> with MontyConfigure("/db/repo") as cf:  # Auto save config when exit
...     cf.load(storage.FlatFileConfig)     # Load flatfile config
...
>>> client = MontyClient("/db/repo")  # Running on flatfile storage now

FlatFile default settings:

connection:
  cache_modified: 0  # how many document CRUD cached before flush to disk.

Change storage engine

MontyConfigure will ignore load() if conf.yaml exists, you need to drop() first before changing the storage engine. The documents will remain on disk and conf.yaml will be deleted.

 >>> with MontyConfigure("/db/repo") as cf:
...     cf.drop()
...     cf.load(storage.WhateverConfig)

Reload configuration

MontyClient will reload conf.yaml at the operation right after client.close().

>>> client.close()
>>> col.insert_one({"doc": 1})  # client auto re-open and reload config

After storage engine configuration, you should feel like using MongoDB's Python driver, unless it's not implemented.

Utilities

  • monty_dump

    Write documents to disk, able to load by monty_load or mongoimport

    >>> from montydb.utils import monty_dump
    >>> documents = [{"a": 1}, {"doc": "some doc"}]
    >>> monty_dump("/path/dump.json", documents)
    
  • monty_load

    Read documents from disk, able to read from monty_dump or mongoexport

    >>> from montydb.utils import monty_load
    >>> monty_load("/path/dump.json")
    [{"a": 1}, {"doc": "some doc"}]
    
  • MontyList

    Experimental, a subclass of list, combined the common CRUD methods from Mongo's Collection and Cursor.

    >>> from montydb.utils import MontyList
    >>> mtl = MontyList([1, 2, {"a": 1}, {"a": 5}, {"a": 8}])
    >>> mtl.find({"a": {"$gt": 3}})
    MontyList([{'a': 5}, {'a': 8}])
    

    You can dump it with monty_dump or read from monty_load

    >>> monty_dump("/path/dump.json", mtl)
    >>> MontyList(monty_load("/path/dump.json"))
    MontyList([1, 2, {'a': 1}, {'a': 5}, {'a': 8}])
    

drawing

Project details


Download files

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

Filename, size & hash SHA256 hash help File type Python version Upload date
montydb-0.0.6-py3-none-any.whl (45.9 kB) Copy SHA256 hash SHA256 Wheel py3
montydb-0.0.6.tar.gz (36.5 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page