SymptomTracker / data_store.py
qaisar701shan's picture
Update data_store.py
981d45d verified
# data_store.py
import sqlite3
import pandas as pd
import io
DB_NAME = "health_data.db"
# expected columns and their SQL types
EXPECTED_COLUMNS = {
"user_id": "TEXT",
"ts": "TEXT",
"age": "INTEGER",
"sex": "TEXT",
"height_cm": "REAL",
"weight_kg": "REAL",
"bmi": "REAL",
"sbp": "REAL",
"dbp": "REAL",
"hr": "REAL",
"spo2": "REAL",
"glucose": "REAL",
"symptoms": "TEXT",
"free_text": "TEXT",
"risk_Type_2_Diabetes_Risk": "REAL",
"risk_Hypertension_Risk": "REAL",
"risk_Depression_Mood_Concern": "REAL",
"risk_Migraine_Risk": "REAL",
"risk_Sleep_Apnea_Risk": "REAL",
"risk_Anemia_Risk": "REAL",
}
def init_db():
"""Initialize DB and ensure expected columns exist (create table or alter as needed)."""
conn = sqlite3.connect(DB_NAME)
cur = conn.cursor()
# If table doesn't exist create it with full schema
cur.execute(
"""
CREATE TABLE IF NOT EXISTS entries (
user_id TEXT,
ts TEXT,
age INTEGER,
sex TEXT,
height_cm REAL,
weight_kg REAL,
bmi REAL,
sbp REAL,
dbp REAL,
hr REAL,
spo2 REAL,
glucose REAL,
symptoms TEXT,
free_text TEXT,
risk_Type_2_Diabetes_Risk REAL,
risk_Hypertension_Risk REAL,
risk_Depression_Mood_Concern REAL,
risk_Migraine_Risk REAL,
risk_Sleep_Apnea_Risk REAL,
risk_Anemia_Risk REAL
)
"""
)
conn.commit()
# Ensure any missing columns are added (handles older DBs)
cur.execute("PRAGMA table_info(entries);")
existing = [row[1] for row in cur.fetchall()] # column names
for col, coltype in EXPECTED_COLUMNS.items():
if col not in existing:
# Add the missing column
alter_sql = f'ALTER TABLE entries ADD COLUMN "{col}" {coltype}'
cur.execute(alter_sql)
conn.commit()
conn.close()
def upsert_entry(entry: dict):
"""Insert entry into SQLite DB (append)."""
conn = sqlite3.connect(DB_NAME)
df = pd.DataFrame([entry])
# Ensure DataFrame columns exist in DB by filling missing expected columns
for col in EXPECTED_COLUMNS.keys():
if col not in df.columns:
df[col] = pd.NA
# Keep only expected columns and in order (prevents unexpected-columns errors)
df = df[[c for c in EXPECTED_COLUMNS.keys() if c in df.columns]]
df.to_sql("entries", conn, if_exists="append", index=False)
conn.close()
def get_user_history(user_id: str) -> pd.DataFrame:
"""Retrieve all entries for a user_id."""
conn = sqlite3.connect(DB_NAME)
try:
df = pd.read_sql_query(
"SELECT * FROM entries WHERE user_id = ? ORDER BY ts ASC",
conn,
params=(user_id,),
)
except Exception:
df = pd.DataFrame()
conn.close()
return df
def to_csv_bytes(df: pd.DataFrame) -> bytes:
"""Return DataFrame as downloadable CSV (bytes)."""
with io.StringIO() as buf:
df.to_csv(buf, index=False)
return buf.getvalue().encode("utf-8")