Built the Sentinel Tab
This commit is contained in:
58
backend/db/pool.py
Normal file
58
backend/db/pool.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
backend/db/pool.py — asyncpg Connection Pool
|
||||
|
||||
Initialises a PostgreSQL connection pool from environment variables.
|
||||
All credentials are sourced from the environment only — never hardcoded.
|
||||
|
||||
Environment variables required:
|
||||
VELOCITY_DB_HOST PostgreSQL host (default: localhost)
|
||||
VELOCITY_DB_PORT PostgreSQL port (default: 5432)
|
||||
VELOCITY_DB_NAME Database name
|
||||
VELOCITY_DB_USER Database user
|
||||
VELOCITY_DB_PASSWORD Database password (injected from AWS SSM at service start)
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from contextlib import asynccontextmanager
|
||||
from typing import AsyncGenerator
|
||||
|
||||
import asyncpg
|
||||
from fastapi import Request
|
||||
|
||||
_pool: asyncpg.Pool | None = None
|
||||
|
||||
|
||||
async def create_pool() -> asyncpg.Pool:
|
||||
"""Creates and returns the application-wide asyncpg connection pool."""
|
||||
global _pool
|
||||
_pool = await asyncpg.create_pool(
|
||||
host=os.environ.get("VELOCITY_DB_HOST", "localhost"),
|
||||
port=int(os.environ.get("VELOCITY_DB_PORT", "5432")),
|
||||
database=os.environ["VELOCITY_DB_NAME"],
|
||||
user=os.environ["VELOCITY_DB_USER"],
|
||||
password=os.environ["VELOCITY_DB_PASSWORD"],
|
||||
min_size=2,
|
||||
max_size=10,
|
||||
command_timeout=30,
|
||||
# Set app_name for easier identification in pg_stat_activity
|
||||
server_settings={"application_name": "velocity-backend"},
|
||||
)
|
||||
return _pool
|
||||
|
||||
|
||||
async def close_pool() -> None:
|
||||
"""Closes the connection pool on application shutdown."""
|
||||
global _pool
|
||||
if _pool:
|
||||
await _pool.close()
|
||||
_pool = None
|
||||
|
||||
|
||||
def get_pool(request: Request) -> asyncpg.Pool:
|
||||
"""FastAPI dependency: returns the pool stored in app.state."""
|
||||
pool: asyncpg.Pool = request.app.state.db_pool
|
||||
if pool is None:
|
||||
raise RuntimeError("Database pool is not initialised.")
|
||||
return pool
|
||||
Reference in New Issue
Block a user