Ir para o conteúdo

MongoZ

mongoz

🔥 ODM com Pydantic simpificado 🔥

Test Suite Package version Supported Python versions


Documentação: https://mongoz.dymmond.com 📚

Código Fonte: https://github.com/dymmond/mongoz


Motivação

MongoZ é um ODM (Object Document Mapper) assíncrono para MongoDB em Python, construído sobre o Motor e o Pydantic.

MongoZ também é inspirado no excelente trabalho do Aminalee com o MongoX.

Então, o porquê de um MongoZ se já existe o MongoX? Bem, o MongoZ é do mesmo autor do Esmerald, Saffier, e muitas outras ferramentas, e todas elas seguem uma necessidade e padrão específicos de desenvolvimento.

O Mongox implementa muito bem algumas operações com o MongoDB, mas para casos de uso onde são necessários Signals, por exemplo, o Mongox não foi desenhado para tal. Além disso, como o criador do Mongoz é o mesmo do Saffier e do Edgy, a interface amigável para interação com o ODM também é essencial.

No final, havia a necessidade de adicionar o Pydantic 2+ com alguns extras que não estavam presentes no Mongox.

MongoZ

Este é uma espécie de fork do Mongox com um core reescrito, mas reutilizando algumas das suas melhores funcionalidades, ao mesmo tempo em que adiciona recursos adicionais e uma interface comum e amigável, para além de intuitiva.

Este ODM é desenhado para ser assíncrono, o que significa flexibilidade e compatibilidade com várias frameworks disponíveis, como Esmerald, FastAPI, Sanic, Starlette, Lilya e muitas outras, tornando o MongoZ independente de qualquer framework.

Funcionalidades

Ao adoptar uma interface mais familiar, este também oferece recursos interessantes e poderosos usando o Pydantic e o Motor.

Sintaxe

Mongoz permite o uso de dois tipos diferentes de sintaxe.

  • Com uma interface familiar inspirada no Edgy.
  • Com uma interface familiar inspirada no Mongox.

A documentação segue uma interface mais familiar inspirada no Edgy, mas também mostrará como pode usar a outra sintaxe também permitida.

Principais recursos

  • Herança de documentos - Para casos em que não quer repetir informações, mantendo a integridade dos documentos.
  • Classes abstratas - Isso mesmo! Às vezes só quer um documento que contenha campos comuns e que não precise ser criado como um documento na base de dados.
  • Classes Meta - Se está familiarizado com o Django, isto não é novidade e o Mongoz oferece isso da mesma forma.
  • Filtros - Filtrar por qualquer campo que queira e precise.
  • Operadores de modelo - Operações clássicas como update, get, get_or_none e muitas outras.
  • Índices - Índices únicos através dos meta campos.
  • Sinais - Recurso bastante útil se você quiser "ouvir" o que está a acontecer com os documentos.

E muito mais pode-se fazer aqui.

Instalação

Para instalar o Mongoz, execute:

$ pip install mongoz

Início Rápido

O seguinte é um exemplo de como começar com o Mongoz e mais detalhes e exemplos podem ser encontrados ao longo da documentação.

Utilize o ipython para executar o seguinte a partir da consola, uma vez que suporta await.

import mongoz

database_uri = "mongodb://localhost:27017"
registry = mongoz.Registry(database_uri)


class User(mongoz.Document):
    name: str = mongoz.String(max_length=255)
    email: str = mongoz.Email(max_length=255)
    is_verified: bool = mongoz.Boolean(default=False)

    class Meta:
        registry = registry
        database = "my_db"

Agora pode gerar alguns documentos e inseri-los na base de dados.

user = await User.objects.create(name="Mongoz", email="mongoz@mongoz.com")
user = await User(name="Mongoz", email="mongoz@mongoz.com").create()

Isso retornará uma instância de um User num modelo Pydantic e o mypy entenderá automaticamente que esta é uma instância de User, o que significa que os tipos e validações funcionarão em todo o lado.

Pesquisar

Como o Mongoz foi construído em cima do Motor, significa que também pode utilizar o mesmo padrão de consulta utilizado no PyMongo/Motor.

user = await User.objects.get(name="Mongoz")
user = await User.query({"name": "Mongoz"}).get()

Ou pode usar os campos do User em vez de dicionários (seleccione a opção "Alternativa" para esta opção).

user = await User.objects.get(name="Mongoz")
user = await User.query({User.name: "Mongoz"}).get()

Ou uma abordagem mais semelhante ao Python (seleccione a opção "Alternativa" para esta opção).

user = await User.objects.get(name="Mongoz")
user = await User.query(User.name == "Mongoz").get()

Existem muitas operações que pode fazer com o Mongoz e pode vê-las todas ao longo da documentação ou na secção Queries.

Mongoz valoriza a simplicidade e não há preferência na sintaxe usada nas pesquisas. Pode usar o que chamamos de opção "Mongoz" e a opção "Alternativa" ao mesmo tempo, pois ambas funcionam muito bem em comum.

Ambas são sintaxes do Mongoz, mas para fins de representação, classificamos com nomes diferentes na documentação.

Observação

A declaração de documentos do Mongoz com tipagem é meramente visual. As validações dos campos não são feitas pela tipagem do atributo dos documentos, mas sim pelos campos do Mongoz.

Isso significa que não precisa se preocupar com a tipagem errada, desde que declare o tipo de campo correcto.

Então isso significa que o Pydantic não funcionará se não declarar o tipo? Claramente que não. Internamente, o Mongoz executa essas validações por meio dos campos declarados e as validações do Pydantic são feitas exatamente da mesma forma que faria num modelo Pydantic normal.

Nada com que se preocupar!