Набор утилит для обегчения создания композитов
Project description
classic-db-utils
Библиотека предоставляет набор утилит, облегчающих разработку компонентов, использующих драйвера к БД напрямую.
Предоставляет классы ConnectionPool, ScopedConnection и Transaction.
Вклад
ConnectionPool взят у Oliver Cope из проекта Embrace.
Установка
Установки с pip:
pip install classic-db-utils
Использование пула соединений
from classic.db_utils import ConnectionPool
import psycopg
pool = ConnectionPool(
lambda: psycopg.connect(
'postgres://example:example@localhost:5432/example',
),
limit=1,
)
with pool.connect() as conn:
conn.cursor().execute('SELECT 1')
ScopedSession
Класс ScopedSession нужен для упрощения управления жизненным циклом соединений и потокобезопаностью. Вдохновлено sqlalchemy.ScopedSession.
Предоставляет интерфейс контекстного менеджера. При входе в контекст берет и удерживает соединение из пула соединений, и предоставляет доступ к атрибутам соединения. При это ScopedSession является thread-local объектом, что означает, что для каждого потока будет удерживаться свое соединение.
from classic.db_utils import ScopedConnection
class UsersRepo:
conn: ScopedConnection
def __init__(self, conn: ScopedConnection):
self.conn = conn
def get_user(self, user_id):
with self.conn: # Здесь произойдет захват соединения из пула
cursor = self.conn.cursor()
cursor.execute('SELECT * FROM users WHERE id = %s', (user_id,))
return cursor.fetchone()
Transaction
Класс ScopedSession нужен для упрощения управления транзакциями. Представляет собой контекстный менеджер. На входе будет задано начало транзакции, при выходе будет вызван .commit у соединения, если не произошло исключение, или вызов .rollback, если исключение произошло.
from classic.db_utils import ScopedConnection, transaction
class UsersRepo:
conn: ScopedConnection
def __init__(self, conn: ScopedConnection):
self.conn = conn
def save_user(self, user_mail: str):
with self.conn, transaction(self.conn):
cursor = self.conn.cursor()
cursor.execute('INSERT INTO users(mail) VALUES (%s)', (user_mail,))
return cursor.fetchone()
Использование с classic-operations
Ниже показан способ инвертирования зависимостей в случае, когда логика приложения не должна зависеть от реализации слоя БД. Логика уровня приложения завернута в operation, и в этот же инстанс operation добавлены ScopedConnection и Transaction. Операция уровня приложения будут происходить в транзакции, но в то же время логика уровня приложения не знает ничего о реализации слоя БД.
from classic.components import component
from classic.db_utils import ConnectionPool, ScopedConnection, transaction
from classic.operations import Operation, operation
import psycopg
# На уровне адаптера к БД:
@component
class UsersRepo:
conn: ScopedConnection
def save_user(self, user_mail: str):
cursor = self.conn.cursor()
cursor.execute('INSERT INTO users(mail) VALUES (%s)', (user_mail,))
return cursor.fetchone()
# На уровне приложения:
@component
class SomeService:
operation_: Operation
users_repo: UsersRepo
@operation
def run(self):
self.users_repo.save_user('some@email.com')
self.users_repo.save_user('another@email.com')
# Композит:
pool = ConnectionPool(lambda: psycopg.connect())
conn = ScopedConnection(pool)
users_repo = UsersRepo(conn)
operation_ = Operation([conn, transaction(conn)])
SomeService(operation_, users_repo)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file classic_db_utils-2.2.2.tar.gz.
File metadata
- Download URL: classic_db_utils-2.2.2.tar.gz
- Upload date:
- Size: 12.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3a5f23eb8dc885b047cb0a6664c62a9acfef248e7b1c98019b8da320ce8dc58
|
|
| MD5 |
e885d8c1baf89493d068733f61b2475f
|
|
| BLAKE2b-256 |
1f946f1a8fd7da063fe58b97d8b2f7ab810202d1a8a758b8002bdc3707d19565
|
File details
Details for the file classic_db_utils-2.2.2-py3-none-any.whl.
File metadata
- Download URL: classic_db_utils-2.2.2-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a14a093f8a06ec56276a413727ca45d59b9d0f7a6b6b43b55f3fff3b9f8d3714
|
|
| MD5 |
83d51cabc8a39d88572a82525cb33d24
|
|
| BLAKE2b-256 |
07fc523f5b018b4e9efa1ad58f219071b6ea48bf87d9454f1fc4d8c2930d23ea
|