from pydantic_settings import BaseSettings import os def _env(*names, default=None): for n in names: v = os.getenv(n) if v: return v return default class Settings(BaseSettings): # support both custom DB_* names and common POSTGRES_* names from postgres images DB_USER: str = _env("DB_USER", "POSTGRES_USER", default="postgres") DB_PASS: str = _env("DB_PASS", "POSTGRES_PASSWORD", default="postgres") DB_NAME: str = _env("DB_NAME", "POSTGRES_DB", default="test_db") DB_HOST: str = _env("DB_HOST", "POSTGRES_HOST", "DB_HOST", default="db") DB_PORT: str = _env("DB_PORT", "POSTGRES_PORT", default="5432") # If explicit DB_* variables are provided, build DATABASE_URL from them (priority). # Otherwise fall back to explicit DATABASE_URL or DATABASE_URL_ASYNC env. _built_db_url: str | None = None if DB_USER and DB_PASS and DB_NAME and DB_HOST and DB_PORT: _built_db_url = f"postgresql+asyncpg://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}" DATABASE_URL: str = _built_db_url or _env("DATABASE_URL", "DATABASE_URL_ASYNC", default="") settings = Settings()