refactor(migrations): Improve idempotency and constraint handling for vitals_baseline source
- Updated migration scripts to ensure idempotent behavior for the source CHECK constraint, allowing for consistent application even if previous migrations were partially successful. - Enhanced SQL logic to drop existing constraints safely and re-add them, ensuring compatibility with the universal CSV import. - Clarified comments for better understanding of migration context and functionality.
This commit is contained in:
parent
5a0c71dd90
commit
1855f6e57a
|
|
@ -1,5 +1,5 @@
|
||||||
-- Universal-CSV-Import setzt source = 'csv'. Alte CHECK-Constraints kennen das nicht.
|
-- 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 $$
|
DO $$
|
||||||
DECLARE
|
DECLARE
|
||||||
r RECORD;
|
r RECORD;
|
||||||
|
|
@ -8,16 +8,22 @@ BEGIN
|
||||||
SELECT c.conname
|
SELECT c.conname
|
||||||
FROM pg_constraint c
|
FROM pg_constraint c
|
||||||
JOIN pg_class t ON c.conrelid = t.oid
|
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 c.contype = 'c'
|
||||||
AND pg_get_constraintdef(c.oid) ILIKE '%source%'
|
AND (
|
||||||
AND pg_get_constraintdef(c.oid) ILIKE '%IN %'
|
c.conname = 'vitals_baseline_source_check'
|
||||||
|
OR COALESCE(pg_get_constraintdef(c.oid), '') ILIKE '%source%'
|
||||||
|
)
|
||||||
LOOP
|
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 LOOP;
|
||||||
END $$;
|
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'));
|
CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv'));
|
||||||
|
|
||||||
COMMENT ON COLUMN vitals_baseline.source IS 'manual | apple_health | garmin | withings | csv (Universal-Import)';
|
COMMENT ON COLUMN vitals_baseline.source IS 'manual | apple_health | garmin | withings | csv (Universal-Import)';
|
||||||
|
|
|
||||||
|
|
@ -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 $$
|
DO $$
|
||||||
DECLARE
|
DECLARE
|
||||||
r RECORD;
|
r RECORD;
|
||||||
|
|
@ -7,14 +8,23 @@ BEGIN
|
||||||
SELECT c.conname
|
SELECT c.conname
|
||||||
FROM pg_constraint c
|
FROM pg_constraint c
|
||||||
JOIN pg_class t ON c.conrelid = t.oid
|
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 c.contype = 'c'
|
||||||
AND pg_get_constraintdef(c.oid) ILIKE '%source%'
|
AND (
|
||||||
AND pg_get_constraintdef(c.oid) ILIKE '%IN %'
|
c.conname = 'vitals_baseline_source_check'
|
||||||
|
OR COALESCE(pg_get_constraintdef(c.oid), '') ILIKE '%source%'
|
||||||
|
)
|
||||||
LOOP
|
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 LOOP;
|
||||||
END $$;
|
|
||||||
|
|
||||||
ALTER TABLE vitals_baseline ADD CONSTRAINT vitals_baseline_source_check
|
EXECUTE $ddl$
|
||||||
CHECK (source IN ('manual', 'apple_health', 'garmin', 'withings', 'csv'));
|
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 $$;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user