| import os | |
| from sqlalchemy import create_engine | |
| from sqlalchemy.orm import sessionmaker | |
| from src.database.candidates.models import Base | |
| from src.configs import get_database_settings | |
| def get_engine(): | |
| """ | |
| Builds a SQLAlchemy engine using validated environment variables. | |
| Works seamlessly in both local and Docker environments. | |
| Priority: | |
| 1. Environment variables (e.g., POSTGRES_HOST from Docker) | |
| 2. .env file defaults via Pydantic config | |
| """ | |
| settings = get_database_settings() | |
| # Allow POSTGRES_HOST override (Docker will set it to 'db') | |
| # Strip whitespace to avoid DNS resolution issues on Windows | |
| postgres_host = os.getenv("POSTGRES_HOST", settings.host).strip() | |
| database_url = ( | |
| f"postgresql+psycopg2://{settings.user}:{settings.password}" | |
| f"@{postgres_host}:{settings.port}/{settings.db}" | |
| ) | |
| print(f"π Connecting to database at {postgres_host}:{settings.port} ...") | |
| # Optional: echo=True for debugging SQL statements | |
| return create_engine(database_url, echo=False, future=True) | |
| # --- SQLAlchemy session setup --- | |
| engine = get_engine() | |
| SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False) |