20260722_110_data_research_ontology.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """Add ontology control-plane state and immutable versions."""
  2. from alembic import op
  3. revision = "20260722_110"
  4. down_revision = "20260722_105"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE IF NOT EXISTS public.ontologies (
  11. uid UUID PRIMARY KEY,
  12. code VARCHAR(120) NOT NULL UNIQUE,
  13. name VARCHAR(300) NOT NULL,
  14. owner_uid VARCHAR(100) NOT NULL,
  15. status VARCHAR(20) NOT NULL DEFAULT 'draft',
  16. draft_revision INTEGER NOT NULL DEFAULT 0,
  17. active_version_uid UUID,
  18. created_by VARCHAR(100),
  19. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  20. updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
  21. );
  22. CREATE TABLE IF NOT EXISTS public.ontology_versions (
  23. uid UUID PRIMARY KEY,
  24. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  25. version INTEGER NOT NULL,
  26. parent_version_uid UUID REFERENCES public.ontology_versions(uid),
  27. status VARCHAR(20) NOT NULL
  28. CHECK (status IN ('draft','published','superseded')),
  29. graph_document JSONB NOT NULL,
  30. content_hash VARCHAR(64) NOT NULL,
  31. created_by VARCHAR(100),
  32. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  33. published_at TIMESTAMPTZ,
  34. UNIQUE (ontology_uid, version)
  35. );
  36. ALTER TABLE public.ontologies
  37. ADD CONSTRAINT fk_ontologies_active_version
  38. FOREIGN KEY (active_version_uid)
  39. REFERENCES public.ontology_versions(uid);
  40. CREATE TABLE IF NOT EXISTS public.ontology_domain_links (
  41. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  42. domain_uid UUID NOT NULL,
  43. role VARCHAR(20) NOT NULL
  44. CHECK (role IN ('owner','contributor','consumer')),
  45. PRIMARY KEY (ontology_uid, domain_uid)
  46. );
  47. CREATE TABLE IF NOT EXISTS public.ontology_change_sets (
  48. uid UUID PRIMARY KEY,
  49. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  50. base_version_uid UUID REFERENCES public.ontology_versions(uid),
  51. status VARCHAR(20) NOT NULL DEFAULT 'draft',
  52. changes JSONB NOT NULL DEFAULT '[]'::jsonb,
  53. decisions JSONB NOT NULL DEFAULT '[]'::jsonb,
  54. created_by VARCHAR(100),
  55. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
  56. );
  57. CREATE TABLE IF NOT EXISTS public.ontology_publish_runs (
  58. uid UUID PRIMARY KEY,
  59. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  60. version_uid UUID NOT NULL REFERENCES public.ontology_versions(uid),
  61. idempotency_key VARCHAR(128) NOT NULL UNIQUE,
  62. status VARCHAR(20) NOT NULL,
  63. validation_result JSONB NOT NULL DEFAULT '{}'::jsonb,
  64. actor_uid VARCHAR(100),
  65. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  66. finished_at TIMESTAMPTZ
  67. );
  68. CREATE INDEX IF NOT EXISTS idx_ontology_versions_ontology
  69. ON public.ontology_versions(ontology_uid, version DESC);
  70. """
  71. )
  72. def downgrade() -> None:
  73. # Published semantic history is preserved during application rollback.
  74. pass