Initial commit
Made-with: Cursor
This commit is contained in:
48
backend/app/database.py
Normal file
48
backend/app/database.py
Normal file
@@ -0,0 +1,48 @@
|
||||
"""asyncpg connection pool and DB access helpers."""
|
||||
|
||||
from collections.abc import AsyncIterator
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
import asyncpg
|
||||
|
||||
from app.config import get_settings
|
||||
|
||||
_pool: asyncpg.Pool | None = None
|
||||
|
||||
|
||||
async def init_db_pool() -> None:
|
||||
"""Create global pool (call from FastAPI lifespan)."""
|
||||
global _pool
|
||||
if _pool is not None:
|
||||
return
|
||||
s = get_settings()
|
||||
_pool = await asyncpg.create_pool(
|
||||
host=s.db_host,
|
||||
port=s.db_port,
|
||||
user=s.db_user,
|
||||
password=s.db_password,
|
||||
database=s.db_name,
|
||||
min_size=1,
|
||||
max_size=10,
|
||||
)
|
||||
|
||||
|
||||
async def close_db_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; call init_db_pool() first")
|
||||
return _pool
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def get_db() -> AsyncIterator[asyncpg.Connection]:
|
||||
"""Async context manager yielding a connection from the pool."""
|
||||
pool = get_pool()
|
||||
async with pool.acquire() as conn:
|
||||
yield conn
|
||||
Reference in New Issue
Block a user