44 lines
999 B
Python
44 lines
999 B
Python
|
|
"""Async Postgres pool."""
|
||
|
|
import asyncpg
|
||
|
|
from app.config import settings
|
||
|
|
|
||
|
|
_pool: asyncpg.Pool | None = None
|
||
|
|
|
||
|
|
|
||
|
|
async def init_pool() -> None:
|
||
|
|
global _pool
|
||
|
|
_pool = await asyncpg.create_pool(
|
||
|
|
dsn=settings.dsn,
|
||
|
|
min_size=2,
|
||
|
|
max_size=10,
|
||
|
|
command_timeout=5,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
async def close_pool() -> None:
|
||
|
|
global _pool
|
||
|
|
if _pool is not None:
|
||
|
|
await _pool.close()
|
||
|
|
_pool = None
|
||
|
|
|
||
|
|
|
||
|
|
def get_pool() -> asyncpg.Pool:
|
||
|
|
if _pool is None:
|
||
|
|
raise RuntimeError("DB pool not initialized")
|
||
|
|
return _pool
|
||
|
|
|
||
|
|
|
||
|
|
async def fetch(query: str, *args) -> list[asyncpg.Record]:
|
||
|
|
async with get_pool().acquire() as conn:
|
||
|
|
return await conn.fetch(query, *args)
|
||
|
|
|
||
|
|
|
||
|
|
async def fetchrow(query: str, *args) -> asyncpg.Record | None:
|
||
|
|
async with get_pool().acquire() as conn:
|
||
|
|
return await conn.fetchrow(query, *args)
|
||
|
|
|
||
|
|
|
||
|
|
async def fetchval(query: str, *args):
|
||
|
|
async with get_pool().acquire() as conn:
|
||
|
|
return await conn.fetchval(query, *args)
|