Skip to main content

Async-first MongoDB ODM for Python, powered by Pydantic v2

Project description

Pygoose

An async-first MongoDB object-document mapper (ODM) for Python, inspired by Mongoose. Pygoose provides a clean, Pydantic-native API for working with MongoDB collections as typed Python classes.

Features

  • Async-first: Built for async/await from the ground up using PyMongo's async client
  • Pydantic-native: Use Pydantic v2 models directly as your documents
  • Type-safe: Full type hints for queries, documents, and relationships
  • QuerySet: Fluent, lazy query builder inspired by Django ORM
  • References: Type-safe document references with automatic population
  • Lifecycle hooks: Pre/post validation, save, delete, and update hooks
  • Encryption: Field-level encryption for sensitive data
  • Plugins: Built-in plugins for timestamps, soft delete, and audit trails
  • FastAPI: First-class FastAPI integration with exception handlers and schema generation

Installation

pip install pygoose

Optional dependencies:

# For field-level encryption
pip install pygoose[encryption]

# For FastAPI integration
pip install pygoose[fastapi]

# For development
pip install pygoose[dev]

Quick start

Define your documents as Pydantic models:

from pygoose import Document
from typing import Optional

class User(Document):
    name: str
    email: str
    age: Optional[int] = None

Connect to MongoDB and perform CRUD operations:

import asyncio
from pygoose import connect, disconnect

async def main():
    # Connect to MongoDB
    await connect("mongodb://localhost:27017/my_database")

    # Create
    user = User(name="Alice", email="alice@example.com", age=30)
    await user.save()

    # Read
    user = await User.find_one({"email": "alice@example.com"})

    # Update
    user.age = 31
    await user.save()

    # Delete
    await user.delete()

    # Cleanup
    await disconnect()

asyncio.run(main())

Use the fluent QuerySet API:

# Find multiple documents
users = await User.find(age={"$gte": 18}).sort("name").limit(10).all()

# Count documents
count = await User.find(age={"$gte": 18}).count()

# Check existence
exists = await User.find({"email": "alice@example.com"}).exists()

FastAPI integration

Pygoose works seamlessly with FastAPI:

from fastapi import FastAPI
from pygoose import connect, disconnect, init_app

app = FastAPI()
init_app(app)

@app.on_event("startup")
async def startup():
    await connect("mongodb://localhost:27017/my_database")

@app.on_event("shutdown")
async def shutdown():
    await disconnect()

@app.post("/users")
async def create_user(user: User):
    await user.save()
    return user

@app.get("/users/{user_id}")
async def get_user(user_id: str):
    from bson import ObjectId
    user = await User.find_one({"_id": ObjectId(user_id)})
    return user

Documentation

Complete documentation is available in the /docs directory:

Requirements

  • Python 3.11 or higher
  • MongoDB 4.4 or higher
  • PyMongo 4.8 or higher (async driver)
  • Pydantic v2 or higher

License

MIT

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

pygoose_odm-0.3.0.tar.gz (75.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pygoose_odm-0.3.0-py3-none-any.whl (31.7 kB view details)

Uploaded Python 3

File details

Details for the file pygoose_odm-0.3.0.tar.gz.

File metadata

  • Download URL: pygoose_odm-0.3.0.tar.gz
  • Upload date:
  • Size: 75.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.17

File hashes

Hashes for pygoose_odm-0.3.0.tar.gz
Algorithm Hash digest
SHA256 6f78f014c7e999393d68686fda488147418f22cc8f8cf727f06e1e6ebb5abb44
MD5 fd5977f6860e1a684862dc8d2cf43669
BLAKE2b-256 82ecc24460864e02b21d45a29598038f95123e55e29e8ca791738f9827d959a1

See more details on using hashes here.

File details

Details for the file pygoose_odm-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pygoose_odm-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 de33c4ebf33256362cc1b1096ad1ad81ac6a0dce655a17d91326bb78202369d6
MD5 6b31bc22fb15a45e3c41cd7a84a459a8
BLAKE2b-256 31b198fcfda738d6070cb1401f5d2e8dfecd909183797f3b7d6206e1fa746a84

See more details on using hashes here.

Supported by

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