Ir para o conteúdo

Registo

Ao utilizar o Mongoz, é necessário utilizar o objeto Registo para indicar exatamente onde a base de dados será escrita.

Imagine o registo como um mapeamento entre os seus documentos e a base de dados onde serão escritos.

E é apenas isso, nada mais, um objeto muito simples mas eficaz.

O registo também é o objeto que pode ser utilizado ao gerar migrações utilizando o Alembic.

import mongoz

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


class User(mongoz.Document):
    """
    The User document to be created in the database as a table
    If no name is provided the in Meta class, it will generate
    a "users" table for you.
    """

    is_active: bool = mongoz.Boolean(default=False)

    class Meta:
        registry = registry
        database = "my_db"

Parâmetros

  • url - O URL da base de dados para se conectar.

    from mongoz import Registo
    
    registo = Registo(url="mongodb://localhost:27017")
    

Registo personalizado

É possível ter o seu próprio Registo personalizado? Sim, claro! Basta criar uma subclasse da classe Registry e continuar a partir daí, como qualquer outra classe Python.

import mongoz

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


class MyRegistry(mongoz.Registry):
    """
    Add logic unique to your registry or override
    existing functionality.
    """

    ...


models = MyRegistry(database_uri)


class User(mongoz.Document):
    """
    The User document to be created in the database as a table
    If no name is provided the in Meta class, it will generate
    a "users" table for you.
    """

    is_active: bool = mongoz.Boolean(default=False)

    class Meta:
        registry = registry
        database = "my_db"

Executar algumas verificações de documentos

Por vezes, pode ser útil garantir que todos os documentos têm os índices atualizados antecipadamente. Isso pode ser especialmente útil se já tiver um documento e alguns índices foram atualizados, adicionados ou removidos. Esta funcionalidade executa essas verificações para todos os documentos do registo fornecido.

import mongoz

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


class User(mongoz.Document):
    """
    The User document to be created in the database as a table
    If no name is provided the in Meta class, it will generate
    a "users" table for you.
    """

    is_active: bool = mongoz.Boolean(default=False)

    class Meta:
        registry = registry
        database = "my_db"


# Make sure the document checks are run
await registry.document_checks()

Utilização numa framework

Esta funcionalidade também pode ser útil se estiver a utilizar, por exemplo, uma framework ASGI como o Starlette, Lilya ou Esmerald.

Estas frameworks tratam do ciclo de vida do evento para si e é aqui que deseja garantir que essas verificações são executadas antecipadamente.

Como o Mongoz é da mesma equipa que o Lilya e o Esmerald, vamos ver como ficaria com o Esmerald.

from contextlib import asynccontextmanager

from esmerald import Esmerald

import mongoz

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


class User(mongoz.Document):
    """
    The User document to be created in the database as a table
    If no name is provided the in Meta class, it will generate
    a "users" table for you.
    """

    is_active: bool = mongoz.Boolean(default=False)

    class Meta:
        registry = registry
        database = "my_db"


# Declare the Esmerald instance
app = Esmerald(routes=[...], on_startup=[registry.document_checks])


# Or using the lifespan
@asynccontextmanager
async def lifespan(app: Esmerald):
    # What happens on startup
    await registry.document_checks()
    yield
    # What happens on shutdown


app = Esmerald(routes=[...], lifespan=lifespan)