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)