Skip to main content

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)

Source distribution for dddmisc-mongo-uow 1.0.1
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)

Table of built distributions (wheels) for dddmisc-mongo-uow 1.0.1
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page