DrugD_clinical_AI / database_schema.py
Oduwo's picture
Update: pharmacy AI integration system with latest changes
86406e9
Raw
History Blame Contribute Delete
10.3 kB
"""
database_schema.py VERSION v3.1
==========================================
"""
import sqlite3, logging
from db_config import DB_PATH
logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s")
log = logging.getLogger(__name__)
def get_conn():
conn = sqlite3.connect(DB_PATH, check_same_thread=False)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA foreign_keys = ON")
conn.execute("PRAGMA journal_mode = WAL")
return conn
def create_all_tables():
conn = get_conn(); cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS medications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL, generic_name TEXT, brand_names TEXT,
category TEXT, drug_class TEXT, medication_type TEXT DEFAULT 'Rx',
atc_code TEXT, dea_schedule TEXT,
mechanism_action TEXT, mechanism_simple TEXT,
absorption TEXT, bioavailability TEXT, protein_binding TEXT,
volume_distribution TEXT, half_life TEXT, time_to_peak TEXT,
metabolism TEXT, metabolites TEXT, excretion TEXT, pk_json TEXT,
onset_action TEXT, duration_action TEXT, receptor_target TEXT,
therapeutic_index TEXT, pd_json TEXT,
dose_adult TEXT, dose_adult_loading TEXT, dose_adult_maintenance TEXT,
dose_pediatric TEXT, dose_geriatric TEXT, dose_renal_adj TEXT,
dose_hepatic_adj TEXT, dose_obesity_adj TEXT, max_daily_dose TEXT,
route_admin TEXT, frequency TEXT, duration_therapy TEXT, food_timing TEXT,
indications TEXT,
conditions_treated TEXT,
contraindications TEXT, warnings TEXT, black_box_warning TEXT,
adverse_effects_common TEXT, adverse_effects_serious TEXT,
toxicity_symptoms TEXT, antidote TEXT,
drug_interactions_list TEXT, food_interactions TEXT, lab_interactions TEXT,
monitoring_params TEXT, lab_tests_required TEXT, tdm_info TEXT,
pregnancy_category TEXT, lactation_safety TEXT,
pediatric_notes TEXT, geriatric_notes TEXT, renal_notes TEXT, hepatic_notes TEXT,
cyp_substrate TEXT, cyp_inhibitor TEXT, cyp_inducer TEXT,
gene_variants TEXT, pharmacogenomic_notes TEXT,
diet_interactions TEXT, nutritional_effects TEXT,
who_essential INTEGER DEFAULT 0, is_active INTEGER DEFAULT 1,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS ayurveda_diet (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL, local_names TEXT,
entry_type TEXT NOT NULL, category TEXT,
botanical_name TEXT, plant_family TEXT, parts_used TEXT,
rasa TEXT, virya TEXT, vipaka TEXT, dosha_effect TEXT,
traditional_uses TEXT, modern_evidence TEXT,
indications TEXT, contraindications TEXT,
calories_per_100g REAL, protein_g REAL, carbs_g REAL,
fat_g REAL, fiber_g REAL, key_nutrients TEXT,
drug_interactions TEXT, interactions_detail TEXT,
dose_adult TEXT, dose_pediatric TEXT, dose_geriatric TEXT,
preparation TEXT, safety_notes TEXT,
glycemic_index TEXT, diet_category TEXT, health_benefits TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS drug_interactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drug_a TEXT NOT NULL, drug_b TEXT NOT NULL,
severity TEXT NOT NULL, interaction_type TEXT,
mechanism TEXT, clinical_effect TEXT, effect TEXT,
management TEXT, evidence_level TEXT, onset TEXT,
created_at TEXT DEFAULT (datetime('now')),
UNIQUE(drug_a, drug_b)
)""")
# FIXED: column names now match seed_genetics.py and frontend exactly
cur.execute("""CREATE TABLE IF NOT EXISTS genetics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
gene_name TEXT NOT NULL,
gene_symbol TEXT,
chromosome TEXT,
enzyme_function TEXT,
population_frequency TEXT,
affected_drugs TEXT,
key_variants TEXT,
phenotype_consequences TEXT,
clinical_actions TEXT,
testing_indications TEXT,
fda_labels_with_pgx TEXT,
evidence_level TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS lab_reference_ranges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
test_name TEXT NOT NULL, abbreviation TEXT, category TEXT,
min_adult_male REAL, max_adult_male REAL,
min_adult_female REAL, max_adult_female REAL,
min_child REAL, max_child REAL,
min_neonate REAL, max_neonate REAL,
unit TEXT, critical_low REAL, critical_high REAL,
clinical_meaning TEXT, drug_effects TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
# Fast, resilient matching for lab lookups.
cur.execute("CREATE INDEX IF NOT EXISTS idx_lab_test_name ON lab_reference_ranges(test_name)")
cur.execute("CREATE INDEX IF NOT EXISTS idx_lab_abbreviation ON lab_reference_ranges(abbreviation)")
cur.execute("CREATE INDEX IF NOT EXISTS idx_lab_test_name_lower ON lab_reference_ranges(LOWER(test_name))")
cur.execute("CREATE INDEX IF NOT EXISTS idx_lab_abbreviation_lower ON lab_reference_ranges(LOWER(abbreviation))")
# FIXED: added name, blood_group, diagnoses columns
cur.execute("""CREATE TABLE IF NOT EXISTS patient_profiles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_code TEXT UNIQUE,
name TEXT,
age INTEGER, weight_kg REAL, height_cm REAL,
gender TEXT, blood_group TEXT,
bmi REAL, bsa_m2 REAL, serum_creatinine REAL,
crcl_ml_min REAL, egfr REAL, albumin REAL,
total_bilirubin REAL, ast REAL, alt REAL,
cyp2d6_phenotype TEXT, cyp3a4_phenotype TEXT,
cyp2c19_phenotype TEXT, cyp2c9_phenotype TEXT,
diagnoses TEXT,
conditions TEXT,
allergies TEXT,
hba1c REAL, tsh REAL, testosterone REAL, estrogen REAL,
is_pregnant INTEGER DEFAULT 0, is_breastfeeding INTEGER DEFAULT 0,
is_smoker INTEGER DEFAULT 0, is_alcoholic INTEGER DEFAULT 0,
role TEXT DEFAULT 'patient', notes TEXT,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
)""")
# FIXED: patient_code→patient_id, added medication_id, dose_prescribed, is_active
cur.execute("""CREATE TABLE IF NOT EXISTS patient_medications (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER NOT NULL,
medication_id INTEGER,
medication_name TEXT,
dose_prescribed TEXT,
dose TEXT,
frequency TEXT, route TEXT,
start_date TEXT, end_date TEXT,
prescribed_by TEXT, indication TEXT,
is_active INTEGER DEFAULT 1,
status TEXT DEFAULT 'active',
notes TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
# FIXED: patient_code→patient_id, added ordered_by
cur.execute("""CREATE TABLE IF NOT EXISTS patient_lab_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER NOT NULL,
test_name TEXT NOT NULL,
value REAL, unit TEXT, test_date TEXT,
status TEXT, notes TEXT,
ordered_by TEXT, entered_by TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
# FIXED: patient_code→patient_id, added plan_json
cur.execute("""CREATE TABLE IF NOT EXISTS diet_plans (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER,
plan_name TEXT, plan_type TEXT,
plan_json TEXT,
calories_target INTEGER, protein_target REAL,
carbs_target REAL, fat_target REAL, fiber_target REAL,
breakfast TEXT, lunch TEXT, dinner TEXT, snacks TEXT,
foods_to_avoid TEXT, created_by_ai INTEGER DEFAULT 1,
notes TEXT, created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS diet_tracker (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER, log_date TEXT, meal_type TEXT,
food_name TEXT, quantity_g REAL, calories REAL,
protein_g REAL, carbs_g REAL, fat_g REAL, fiber_g REAL,
notes TEXT, created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS ml_predictions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER, model_name TEXT,
prediction TEXT, probability REAL, confidence TEXT,
features_used TEXT, recommendation TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS clinical_notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER, note_type TEXT,
note_text TEXT, author_role TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
# FIXED: renamed protocol_name → name
cur.execute("""CREATE TABLE IF NOT EXISTS emergency_protocols (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
category TEXT, indication TEXT,
steps TEXT, medications TEXT, drugs TEXT, doses TEXT,
notes TEXT, reference TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("CREATE INDEX IF NOT EXISTS idx_emergency_category ON emergency_protocols(category)")
# Added plain_english column for patient education
cur.execute("""CREATE TABLE IF NOT EXISTS conditions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
icd10 TEXT, description TEXT,
plain_english TEXT,
first_line_drugs TEXT, second_line_drugs TEXT,
monitoring TEXT, patient_education TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
cur.execute("""CREATE TABLE IF NOT EXISTS audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_role TEXT, action TEXT, table_name TEXT,
record_id TEXT, detail TEXT,
created_at TEXT DEFAULT (datetime('now'))
)""")
conn.commit(); conn.close()
log.info("✅ All 15 tables created / verified in %s", DB_PATH)
if __name__ == "__main__":
create_all_tables()