#python #contextmanager #asyncpg
Вопрос:
Я использую asyncpg
. У меня есть класс Database
с кучей методов для взаимодействия с моей базой данных. Проблема в том, что все эти методы должны иметь такой контекстный менеджер, как этот:
async with ( self.pool.acquire() as conn, conn.transaction() ):
, что на самом деле не является повторным использованием кода.
Я попробовал это:
class DBContextManager: def __init__(self, pool): self.pool: asyncpg.Pool = pool async def __aenter__(self): acquire_context = self.pool.acquire() self.connection = await acquire_context.__aenter__() self.connection._check_open() self.transaction = Transaction(self.connection, None, False, False) await self.transaction.__aenter__() return self.connection async def __aexit__(self): await self.transaction.__aexit__() await self.connection.__aexit__()
, но это, похоже, не работает, и я сам не могу понять, почему:
Traceback (most recent call last): File "project/utils/database/api.py", line 54, in get_admins async with DBContextManager(self.pool) as conn: File "project/utils/database/api.py", line 25, in __aenter__ await self.transaction.__aenter__() File "project/venv/lib/python3.10/site-packages/asyncpg/transaction.py", line 62, in __aenter__ await self.start() File "project/venv/lib/python3.10/site-packages/asyncpg/transaction.py", line 104, in start con._top_xact = self AttributeError: 'PoolConnectionProxy' object has no attribute '_top_xact'