20260722_110_data_research_ontology.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 CHECK (status IN ('draft','published','superseded')),
  28. graph_document JSONB NOT NULL,
  29. content_hash VARCHAR(64) NOT NULL,
  30. created_by VARCHAR(100),
  31. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  32. published_at TIMESTAMPTZ,
  33. UNIQUE (ontology_uid, version)
  34. );
  35. ALTER TABLE public.ontologies
  36. ADD CONSTRAINT fk_ontologies_active_version
  37. FOREIGN KEY (active_version_uid) REFERENCES public.ontology_versions(uid);
  38. CREATE TABLE IF NOT EXISTS public.ontology_domain_links (
  39. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  40. domain_uid UUID NOT NULL,
  41. role VARCHAR(20) NOT NULL CHECK (role IN ('owner','contributor','consumer')),
  42. PRIMARY KEY (ontology_uid, domain_uid)
  43. );
  44. CREATE TABLE IF NOT EXISTS public.ontology_change_sets (
  45. uid UUID PRIMARY KEY,
  46. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  47. base_version_uid UUID REFERENCES public.ontology_versions(uid),
  48. status VARCHAR(20) NOT NULL DEFAULT 'draft',
  49. changes JSONB NOT NULL DEFAULT '[]'::jsonb,
  50. decisions JSONB NOT NULL DEFAULT '[]'::jsonb,
  51. created_by VARCHAR(100),
  52. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
  53. );
  54. CREATE TABLE IF NOT EXISTS public.ontology_publish_runs (
  55. uid UUID PRIMARY KEY,
  56. ontology_uid UUID NOT NULL REFERENCES public.ontologies(uid),
  57. version_uid UUID NOT NULL REFERENCES public.ontology_versions(uid),
  58. idempotency_key VARCHAR(128) NOT NULL UNIQUE,
  59. status VARCHAR(20) NOT NULL,
  60. validation_result JSONB NOT NULL DEFAULT '{}'::jsonb,
  61. actor_uid VARCHAR(100),
  62. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  63. finished_at TIMESTAMPTZ
  64. );
  65. CREATE INDEX IF NOT EXISTS idx_ontology_versions_ontology
  66. ON public.ontology_versions(ontology_uid, version DESC);
  67. """
  68. )
  69. def downgrade() -> None:
  70. # Published semantic history is preserved during application rollback.
  71. pass