Идея состоит в том, чтобы создать живое соединение с вызывающей стороной, убедиться, что его можно использовать с async/await, и гарантировать очистку (закрыть соединение) после завершения вызывающей стороны.
Упрощенный пример того, что я пытаюсь сделать:
Код: Выделить всё
from typing import AsyncGenerator
import asyncpg
async def get_db_connection() -> AsyncGenerator[asyncpg.Connection, None]:
conn = await asyncpg.connect(dsn="postgresql://user:pass@localhost/db")
try:
yield conn
finally:
await conn.close()
Код: Выделить всё
async for conn in get_db_connection():
await conn.execute("INSERT INTO users VALUES ($1)", "Alice")
- Рекомендуется ли использование асинхронного генератора, подобного этому, для управления жизненными циклами соединений с базой данных?
- Есть ли какие-либо скрытые подводные камни, связанные с обработкой ошибок, отменой или утечками соединений?
- Этот подход лучше или хуже, чем использование @asynccontextmanager из contextlib?
- Как этот подход масштабируется при использовании с пулами соединений вместо одного соединения?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -lifecycle
Мобильная версия