Spaces:
Running
Running
File size: 1,692 Bytes
89acd07 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | from contextlib import contextmanager
from typing import Any
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session, sessionmaker
from .config import get_settings
settings = get_settings()
engine = None
SessionLocal = None
database_url = settings.database_url
if database_url:
if database_url.startswith("postgresql://"):
database_url = database_url.replace("postgresql://", "postgresql+psycopg://", 1)
engine = create_engine(
database_url,
future=True,
pool_pre_ping=True,
)
SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True)
else:
print("WARNING: DATABASE_URL is empty. Database features will be disabled.")
@contextmanager
def get_session() -> Session:
if not SessionLocal:
raise ValueError("Database connection not established. Please check your DATABASE_URL.")
session = SessionLocal()
try:
yield session
finally:
session.close()
def run_sql(session: Session, sql: str, params: dict[str, Any] | None = None) -> list[dict[str, Any]]:
result = session.execute(text(sql), params or {})
return [dict(row) for row in result.mappings().all()]
def init_app_tables() -> None:
if not engine:
return
create_chat_history_sql = """
CREATE TABLE IF NOT EXISTS chat_messages (
id BIGSERIAL PRIMARY KEY,
session_id TEXT NOT NULL,
role TEXT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
"""
with engine.begin() as conn:
conn.execute(text(create_chat_history_sql))
|