Features:
All example run into:
python -m asyncio
from ampo import CollectionWorker, AMPODatabase, ORMConfig, init_collection
# Initilize DB before calls db methods
AMPODatabase(url="mongodb://test")
# Pydantic Model
class ModelA(CollectionWorker):
field1: str
field2: int
model_config = ORMConfig(
orm_collection="test"
)
await init_collection()
inst_a = ModelA("test", 123)
await inst_a.save()
# Get object
inst_a = await ModelA.get(field1="test")
For search by 'id' usages in filter '_id' or 'id' name.
# import
# Initilize DB before calls db methods
AMPODatabase(url="mongodb://test")
# Pydantic Model
class ModelA(CollectionWorker):
field1: str
model_config = ORMConfig(
orm_collection="test",
orm_indexes=[
{
"keys": ["field1"],
"options": {
"unique": True
}
}
]
)
# This method create indexes
# Call only one time
await init_collection()
Suppport options:
Keys is list of fields.
It works only with single field (TTL Indexes).
You should set the option 'expireAfterSeconds', and field 'keys' should have only single field.
Example:
# import
# Initilize DB before calls db methods
AMPODatabase(url="mongodb://test")
# Pydantic Model
class ModelA(CollectionWorker):
field1: datetime
model_config = ORMConfig(
orm_collection="test",
orm_indexes=[
{
"keys": ["field1"],
"options": {
"expireAfterSeconds": 10
}
}
]
)
# optional, set new value
ModelA.update_expiration_value("field1", 20)
await init_collection()
if you want to set the 'expireAfterSeconds' only from method 'update_expiration_value', set it to '-1'. if you want skip the index changed, call method 'expiration_index_skip' before init_collection.
It is supported by default. Just, you need create the embedded document as class of pydantic - 'BaseModel'. It will be stored into db as object.
Example:
from pydantic import BaseModel
class Embeded(BaseModel):
name: str
class ModelA(CollectionWorker):
field1: str
field2: Embeded
model_config = ORMConfig(
orm_collection="test"
)
It is a mechanism that allows you to retrieve a record with a lock. It is based on the findOneAndUpdate(). When the record is found, the field "lock_field" is set to True. And when the next search is made, this record will be skipped.
Example:
import datetime
from typing import Optional
from ampo import CollectionWorker, AMPODatabase, ORMConfig, init_collection
# Pydantic Model
class ModelA(CollectionWorker):
field1: str
lfield: bool = False
field_dt_start: Optional[datetime.datetime] = None
model_config = ORMConfig(
orm_collection="test",
orm_lock_record={
"lock_field": "lfield",
"lock_field_time_start": "field_dt_start",
}
)
await init_collection()
inst_a = ModelA("test", 123)
await inst_a.save()
inst_a = await ModelA.get_and_lock(field1="test")
# process
await inst_a.reset_lock()
# as context
async with ModelA.get_and_lock_context(field1="test") as inst_a:
pass
# process
Style:
Run tests:
env TEST_MONGO_URL=mongodb://localhost/test pytest