api / database.py
jamelloverz-sketch
feat: unified FastAPI v3 - merge all APIs into main org space
8c4dbdb
Raw
History Blame
2.47 kB
import json
import os
import aiohttp
from config import DB_SPACE_URL, HF_TOKEN
HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"}
_session: aiohttp.ClientSession | None = None
async def get_session() -> aiohttp.ClientSession:
global _session
if _session is None:
_session = aiohttp.ClientSession(headers=HEADERS)
return _session
async def close_session():
global _session
if _session:
await _session.close()
_session = None
def _escape(val):
if val is None:
return "NULL"
t = type(val)
if t is int or t is float:
return str(val)
if t is bool:
return "1" if val else "0"
s = str(val).replace("'", "''")
return f"'{s}'"
def _build_sql(sql: str, params: list | None = None) -> str:
# Internal use only: builds SQL from template with ? placeholders
if not params:
return sql
parts = sql.split("?")
result = parts[0]
for i, p in enumerate(params):
val = p
if not isinstance(val, (int, float, bool)):
val = str(val)
if i + 1 < len(parts):
result += _escape(val) + parts[i + 1]
else:
result += _escape(val)
return result
async def exec(sql: str, params: list = None) -> dict:
session = await get_session()
full_sql = _build_sql(sql, params)
async with session.post(f"{DB_SPACE_URL}/exec", json={"sql": full_sql}) as resp:
return await resp.json()
async def query(sql: str, params: list = None) -> dict:
session = await get_session()
full_sql = _build_sql(sql, params)
async with session.get(f"{DB_SPACE_URL}/query", params={"sql": full_sql}) as resp:
return await resp.json()
async def fetch_all(sql: str, params: list = None) -> list[dict]:
r = await query(sql, params)
if not r or "rows" not in r or not r["rows"]:
return []
cols = r.get("cols") or r.get("columns", [])
col_names = [c["name"] if isinstance(c, dict) else c for c in cols]
return [dict(zip(col_names, row)) for row in r["rows"]]
async def fetch_one(sql: str, params: list = None) -> dict | None:
rows = await fetch_all(sql, params)
return rows[0] if rows else None
async def execute(sql: str, params: list = None) -> dict:
return await exec(sql, params)
async def init_tables(sqls: list[str]) -> list[dict]:
results = []
for sql in sqls:
r = await exec(sql)
results.append(r)
return results