diff --git a/backend/migrations/048_vitals_baseline_source_csv.sql b/backend/migrations/048_vitals_baseline_source_csv.sql index 7844d06..0350c89 100644 --- a/backend/migrations/048_vitals_baseline_source_csv.sql +++ b/backend/migrations/048_vitals_baseline_source_csv.sql @@ -1,5 +1,5 @@ -- Universal-CSV-Import setzt source = 'csv'. Alte CHECK-Constraints kennen das nicht. --- Namen können je nach PG-Version abweichen → alle passenden CHECK Constraints zu source droppen. +-- Alle passenden CHECKs zu `source` droppen (PG speichert IN oder = ANY (ARRAY[...])). DO $$ DECLARE r RECORD; @@ -8,16 +8,22 @@ BEGIN SELECT c.conname FROM pg_constraint c JOIN pg_class t ON c.conrelid = t.oid - WHERE t.relname = 'vitals_baseline' + JOIN pg_namespace n ON n.oid = t.relnamespace + WHERE n.nspname = 'public' + AND t.relname = 'vitals_baseline' AND c.contype = 'c' - AND pg_get_constraintdef(c.oid) ILIKE '%source%' - AND pg_get_constraintdef(c.oid) ILIKE '%IN %' + AND ( + c.conname = 'vitals_baseline_source_check' + OR COALESCE(pg_get_constraintdef(c.oid), '') ILIKE '%source%' + ) LOOP - EXECUTE format('ALTER TABLE vitals_baseline DROP CONSTRAINT %I', r.conname); + EXECUTE format('ALTER TABLE public.vitals_baseline DROP CONSTRAINT %I', r.conname); END LOOP; END $$; -ALTER TABLE vitals_baseline ADD CONSTRAINT vitals_baseline_source_check +ALTER TABLE public.vitals_baseline DROP CONSTRAINT IF EXISTS vitals_baseline_source_check; + +ALTER TABLE public.vitals_baseline ADD CONSTRAINT vitals_baseline_source_check CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv')); COMMENT ON COLUMN vitals_baseline.source IS 'manual | apple_health | garmin | withings | csv (Universal-Import)'; diff --git a/backend/migrations/049_vitals_baseline_source_csv_idempotent.sql b/backend/migrations/049_vitals_baseline_source_csv_idempotent.sql index 1eca76f..73ec928 100644 --- a/backend/migrations/049_vitals_baseline_source_csv_idempotent.sql +++ b/backend/migrations/049_vitals_baseline_source_csv_idempotent.sql @@ -1,4 +1,5 @@ --- Idempotent: erneute Bereinigung der source-CHECK, falls 048 zuvor nicht griff oder nur teilweise lief. +-- Idempotent: gleicher Zielzustand wie 048, auch wenn die CHECK schon existiert (z. B. 048 DB-seitig +-- erfolgreich, aber nicht in schema_migrations). Ein einziges DO vermeidet Mehrfach-Statement-Probleme. DO $$ DECLARE r RECORD; @@ -7,14 +8,23 @@ BEGIN SELECT c.conname FROM pg_constraint c JOIN pg_class t ON c.conrelid = t.oid - WHERE t.relname = 'vitals_baseline' + JOIN pg_namespace n ON n.oid = t.relnamespace + WHERE n.nspname = 'public' + AND t.relname = 'vitals_baseline' AND c.contype = 'c' - AND pg_get_constraintdef(c.oid) ILIKE '%source%' - AND pg_get_constraintdef(c.oid) ILIKE '%IN %' + AND ( + c.conname = 'vitals_baseline_source_check' + OR COALESCE(pg_get_constraintdef(c.oid), '') ILIKE '%source%' + ) LOOP - EXECUTE format('ALTER TABLE vitals_baseline DROP CONSTRAINT %I', r.conname); + EXECUTE format('ALTER TABLE public.vitals_baseline DROP CONSTRAINT %I', r.conname); END LOOP; -END $$; -ALTER TABLE vitals_baseline ADD CONSTRAINT vitals_baseline_source_check - CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv')); + EXECUTE $ddl$ + ALTER TABLE public.vitals_baseline ADD CONSTRAINT vitals_baseline_source_check + CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv')) + $ddl$; +EXCEPTION + WHEN duplicate_object THEN + NULL; +END $$;