брать коннекшн?
class DBStorage(Gateway):
driver_name = 'DBStorage'
def __init__(self, config):
self._config = config
self._guard = None
self._log = None
self.connection = None
if hasattr(config, 'driver_name') and getattr(config, 'driver_name', None):
self.driver_name = config.driver_name
async def _connect(self):
print('..._connect')
print('CONFIG', self._config.dsn)
self.connection = await asyncpg.connect(self._config.dsn)
async def _close(self):
await self.connection.close()
async def __aenter__(self):
print('aenter db')
await self._connect()
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
print('aexit db')
await self._close()
async def execute(self, query, *args):
print(f'con: {self.connection}', query)
async with self.connection as con:
result = await con.execute(query, *args)
return result.fetch()
пишет async with self.connection as con:
TypeError: 'NoneType' object does not support the asynchronous context manager protocol
интересно почему не инициализируется connection
Привет, можешь плиз в patebin завернуть код?
https://pastebin.com/NXznMzwy
https://magicstack.github.io/asyncpg/current/api/index.html#connection у объекта Connection нету реализации методов aenter aexit
спасибо, тогда получается мне надо вообще убирать метод execute из DBStorage и переименовывать DBStorage в DBConnection, чтоб использовать как контестный менеджер, т.к. я добавил туда aenter async with DBStorage(**dsn) as con: res = await con.fetch(select.... from ...) return res
А есть ли необходимость использовать его как контекстный менеджер?
ну а как по другому безопасно делать запрос без Алхимии через чистый asyncpg, чтоб закрывалось соединение?
Cудя по коду, ты планируешь на каждый запрос создавать объект соединения с БД и каждый раз закрывать после выполнения запроса, такое поведение нужно в твоем приложении?
ну да, у меня по сценарию модуль отвечает только за сохранение одной сущности, и это не очень высоконагружено, но т.к. другие микросервисы могут тоже работать с БД, то наверно лучше было бы закрывать за собой открытые соединения, если они не используются. Могу ошибаться конечно. В алхимии обычно это реализуется с помощью сессии
Я бы наверно посмотрел в сторону https://www.pgbouncer.org
спасибо, ознакомлюсь
Обсуждают сегодня