Migration 014: - blood_pressure_systolic/diastolic (mmHg) - pulse (bpm) - during BP measurement - vo2_max (ml/kg/min) - from Apple Watch - spo2 (%) - blood oxygen saturation - respiratory_rate (breaths/min) - irregular_heartbeat, possible_afib (boolean flags from Omron) - Added 'omron' to source enum Backend: - Updated Pydantic models (VitalsEntry, VitalsUpdate) - Updated all SELECT queries to include new fields - Updated INSERT/UPDATE with COALESCE for partial updates - Validation: at least one vital must be provided Preparation for Omron + Apple Health imports Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
30 lines
1.9 KiB
SQL
30 lines
1.9 KiB
SQL
-- Migration 014: Extended Vitals (Blood Pressure, VO2 Max, SpO2, Respiratory Rate)
|
|
-- v9d Phase 2d: Complete vitals tracking
|
|
-- Date: 2026-03-23
|
|
|
|
-- Add new vitals fields
|
|
ALTER TABLE vitals_log
|
|
ADD COLUMN IF NOT EXISTS blood_pressure_systolic INTEGER CHECK (blood_pressure_systolic > 0 AND blood_pressure_systolic < 300),
|
|
ADD COLUMN IF NOT EXISTS blood_pressure_diastolic INTEGER CHECK (blood_pressure_diastolic > 0 AND blood_pressure_diastolic < 200),
|
|
ADD COLUMN IF NOT EXISTS pulse INTEGER CHECK (pulse > 0 AND pulse < 250),
|
|
ADD COLUMN IF NOT EXISTS vo2_max DECIMAL(4,1) CHECK (vo2_max > 0 AND vo2_max < 100),
|
|
ADD COLUMN IF NOT EXISTS spo2 INTEGER CHECK (spo2 >= 70 AND spo2 <= 100),
|
|
ADD COLUMN IF NOT EXISTS respiratory_rate DECIMAL(4,1) CHECK (respiratory_rate > 0 AND respiratory_rate < 60),
|
|
ADD COLUMN IF NOT EXISTS irregular_heartbeat BOOLEAN DEFAULT false,
|
|
ADD COLUMN IF NOT EXISTS possible_afib BOOLEAN DEFAULT false;
|
|
|
|
-- Update source check to include omron
|
|
ALTER TABLE vitals_log DROP CONSTRAINT IF EXISTS vitals_log_source_check;
|
|
ALTER TABLE vitals_log ADD CONSTRAINT vitals_log_source_check
|
|
CHECK (source IN ('manual', 'apple_health', 'garmin', 'omron'));
|
|
|
|
-- Comments
|
|
COMMENT ON COLUMN vitals_log.blood_pressure_systolic IS 'Systolic blood pressure (mmHg) from Omron or manual entry';
|
|
COMMENT ON COLUMN vitals_log.blood_pressure_diastolic IS 'Diastolic blood pressure (mmHg) from Omron or manual entry';
|
|
COMMENT ON COLUMN vitals_log.pulse IS 'Pulse during blood pressure measurement (bpm)';
|
|
COMMENT ON COLUMN vitals_log.vo2_max IS 'VO2 Max from Apple Watch (ml/kg/min)';
|
|
COMMENT ON COLUMN vitals_log.spo2 IS 'Blood oxygen saturation (%) from Apple Watch';
|
|
COMMENT ON COLUMN vitals_log.respiratory_rate IS 'Respiratory rate (breaths/min) from Apple Watch';
|
|
COMMENT ON COLUMN vitals_log.irregular_heartbeat IS 'Irregular heartbeat detected (Omron)';
|
|
COMMENT ON COLUMN vitals_log.possible_afib IS 'Possible atrial fibrillation (Omron)';
|