MongoDB async ddd-misc UnitOfWork
MongoDB UnitOfWork на базе ddd-misc и библиотеки Motor: Asynchronous Python driver for MongoDB.
Классы
AbstractMongoRepository
AbstractMongoRepository - абстрактный класс для реализации репозитория с подключением к базе данных MongoDB. Класс реализует сигнатуру для инициализации с двумя параметрами помимо self и метод 'get_mongo_collection':
- 'connection' - параметр принимающий контекст инстанса класса AsyncIOMotorClientSession библиотеки Motor.
- 'collections' - параметр принимающий структуру dict ключами которой являются название mongo коллекции в виде строки, а значениями объект класса AsyncIOMotorCollection библиотеки Motor.
'_get_mongo_collection' - метод класса AbstractMongoRepository, возвращающий mongo коллекцию по передаваемому названию в параметре в виде строки.
Данный класс обязателен для наследования при реализации конкретного MongoDB репозитория в рамках UnitOfWork данного пакета.
Пример использования:
from dddmisc_mongo_uow import AbstractMongoRepository
class ConcreteMongoRepository(AbstractMongoRepository):
aggregate_class = ConcreteAggregateClass
async def _add_to_storage(self, aggregate):
document = dict(
key=aggregate._key,
reference=str(aggregate.reference)
)
collection = self._get_mongo_collection('uow')
await collection.update_one({'reference': document['reference']}, {'$set' : document}, upsert=True, session=self._connection)
MongoEngine
MongoEngine - класс для создания структуры engine MongoDB версии, engine передается в параметры при инициализации AsyncMessageBus. При инициализации MongoEngine требует трех обязательных параметров:
- 'address' - параметр принимающий строку для подключения к конкретной базе данных MongoDB, включающей в себя хост базы, а так же дополнительные параметры подключения. Пример - 'mongodb://localhost:27017/?directConnection=true'. При инициализации по параметру создается объект AsyncIOMotorClient.
- 'db_name' - параметр принимающий строку с названием базы данных. При инициализации создается объект AsyncIOMotorDatabase.
- 'collections' - парамтер принимающий массив с названиями коллекции MongoDB в виде строк. При инициализации создается структура неизменяемого dict, ключами которой являются названия коллекции, а значениями объекты AsyncIOMotorCollection с подключением к данным коллекциям.
'get_collections' - метод возвращающий коллекции.
'get_session' - асинхронный метод возврщающий объект AsyncIOMotorClientSession для проведения транзакции.
Пример использования:
from dddmisc_mongo_uow import MongoEngine
mongo_engine = MongoEngine(address='mongodb://localhost:27017/?directConnection=true', db_name='mongo_uow', collections=['uow'])
collections = mongo_engine.get_collections()
session = await mongo_engine.get_session()
MongoMotorUOW
MongoMotorUOW - класс на базе AbstractAsyncUnitOfWork, реализующий конкретный объект UnitOfWork и его стандартное поведение в рамках ddd-misc для выполнения транзакции в MongoDB.
Класс реализует стандартную сигнатуру для создания объекта UnitOfWork в процессе выполнения хэндлера в объекте AsyncMessageBus, требующую двух параметров engine и repository_class. В процессе инициализации проверяется является ли repository_class субклассом AbstractMongoRepository, далее repository_class оборачивается классом декоратором вместе с параметром collections, чтобы UnitOfWork мог передавать один параметр connection при инициализации репозитория.
Пример использования:
from dddmisc import AsyncMessageBus
from dddmisc_mongo_uow import MongoMotorUOW
message_bus = AsyncMessageBus(
uow_class=MongoMotorUOW,
repository_class=ConcreteMongoRepository,
engine=mongo_engine
)
Основные параметры для запуска MongoDB в .gitlab-ci.yml:
services:
- name: mongo:6.0
alias: mongo-svc
command: ["mongod", "--logpath=/dev/null", "--bind_ip_all", "--replSet=rs0"]
before_script:
- python -V
- python -m venv .venv
- poetry install
- apt-get update && apt-get install -y gnupg
- apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*
- wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | apt-key add -
- echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/6.0 main" | tee /etc/apt/sources.list.d/mongodb-org-6.0.list
- apt-get update
- apt-get install -y mongodb-org
- mongosh --host mongo-svc --eval "rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'127.0.0.1:27017'}]});"
script:
- mongosh --host mongo-svc --eval "rs.status()"
- poetry run poe test
При установке отличающейся версии MongoDB параметры установки нужно изменить на акутальную версию.
Комманда rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'mongo-svc'}]}); инициирует реплику.
На странице https://www.mongodb.com/docs/manual/reference/connection-string/ описан формат строки подключения и разные его варианты.
Стандартный формат подключения:
- 'mongodb://localhost:27017/'
Рабочий формат подключения на локальном компьютере при инициации 'rs.initiate()':
- 'mongodb://localhost:27017/?directConnection=true'
При инициации 'rs.initiate({'_id':'rs0','members':[{'_id':0,'host':'mongo-svc'}]})' создается конкретная реплика, их может быть несколько, например:
rs.initiate(
{
_id: "rs0",
version: 1,
members: [
{ _id: 0, host : "mongodb0.example.net:27017" },
{ _id: 1, host : "mongodb1.example.net:27017" },
{ _id: 2, host : "mongodb2.example.net:27017" }
]
}
)
'rs0' - имя набора реплик, задается при поднятии базы, строка подключения на локалке:
- 'mongodb://localhost:27017/?directConnection=true&replicaSet=rs0
Metadata
Release files for dddmisc-mongo-uow 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dddmisc_mongo_uow-1.0.1.tar.gz | 5.5 kB | Without provenance | Details for dddmisc_mongo_uow-1.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dddmisc_mongo_uow-1.0.1-py3-none-any.whl | Python 3 | none | any | Details for dddmisc_mongo_uow-1.0.1-py3-none-any.whl |
Total release size: 10.7 kB
Release files / dddmisc_mongo_uow-1.0.1.tar.gz
| Download URL | dddmisc_mongo_uow-1.0.1.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
02af6ac9b46675bb3c852d09a69efcf573bb91720c88572915dca83aa444a014
|
|
BLAKE2b-256 checksum How to use checksums |
e4da56e6b67269b068c39273bcd9dde4bfddde89ce28a3180f7ff80b59f16454
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.3.2 CPython/3.10.10 Linux/3.10.0-1160.90.1.el7.x86_64
|
Release files / dddmisc_mongo_uow-1.0.1-py3-none-any.whl
| Download URL | dddmisc_mongo_uow-1.0.1-py3-none-any.whl |
|---|---|
| Size | 5.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ddfd374ac161c6b69201163ee750f08c64f7585b63858377a5e82879d79ef77b
|
|
BLAKE2b-256 checksum How to use checksums |
272bc1b0c10d331fd3dca82eb2c97bc19ea4c15a7ce8cb469bdd47481845c885
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.3.2 CPython/3.10.10 Linux/3.10.0-1160.90.1.el7.x86_64
|
Security for dddmisc-mongo-uow 1.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.