Files
ledgerdock/backend/app/db/base.py
2026-02-21 09:44:18 -03:00

54 lines
1.6 KiB
Python

"""Database engine and session utilities for persistence operations."""
from collections.abc import Generator
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session, declarative_base, sessionmaker
from app.core.config import get_settings
Base = declarative_base()
settings = get_settings()
engine = create_engine(settings.database_url, pool_pre_ping=True)
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, expire_on_commit=False)
def get_session() -> Generator[Session, None, None]:
"""Provides a transactional database session for FastAPI request handling."""
session = SessionLocal()
try:
yield session
finally:
session.close()
def init_db() -> None:
"""Initializes all ORM tables and search-related database extensions/indexes."""
from app import models # noqa: F401
Base.metadata.create_all(bind=engine)
with engine.begin() as connection:
connection.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm"))
connection.execute(
text(
"""
CREATE INDEX IF NOT EXISTS idx_documents_text_search
ON documents
USING GIN (
to_tsvector(
'simple',
coalesce(original_filename, '') || ' ' ||
coalesce(logical_path, '') || ' ' ||
coalesce(extracted_text, '')
)
)
"""
)
)
connection.execute(text("CREATE INDEX IF NOT EXISTS idx_documents_sha256 ON documents (sha256)"))