20260716_40_governance_knowledge.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """Add versioned governance knowledge documents and Qwen embeddings."""
  2. from alembic import op
  3. revision = "20260716_40"
  4. down_revision = "20260716_30"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute("""
  9. CREATE EXTENSION IF NOT EXISTS vector;
  10. CREATE TABLE IF NOT EXISTS public.governance_documents (
  11. id UUID PRIMARY KEY,
  12. object_uid UUID NOT NULL,
  13. object_type VARCHAR(40) NOT NULL,
  14. object_version INTEGER NOT NULL,
  15. object_name VARCHAR(300) NOT NULL,
  16. business_domain_uid UUID,
  17. permission_scope JSONB NOT NULL DEFAULT '{}'::jsonb,
  18. content TEXT NOT NULL,
  19. content_hash CHAR(64) NOT NULL,
  20. status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active','superseded','deleted')),
  21. source_updated_at TIMESTAMPTZ,
  22. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  23. UNIQUE (object_uid, object_version)
  24. );
  25. CREATE UNIQUE INDEX IF NOT EXISTS uq_governance_document_active ON public.governance_documents(object_uid) WHERE status = 'active';
  26. CREATE TABLE IF NOT EXISTS public.governance_chunks (
  27. id UUID PRIMARY KEY,
  28. document_id UUID NOT NULL REFERENCES public.governance_documents(id) ON DELETE CASCADE,
  29. chunk_no INTEGER NOT NULL,
  30. content TEXT NOT NULL,
  31. content_hash CHAR(64) NOT NULL,
  32. embedding vector(1024),
  33. embedding_provider VARCHAR(30),
  34. embedding_model VARCHAR(100),
  35. embedding_dimension INTEGER,
  36. UNIQUE (document_id, chunk_no)
  37. );
  38. CREATE TABLE IF NOT EXISTS public.governance_sync_jobs (
  39. id UUID PRIMARY KEY,
  40. job_type VARCHAR(30) NOT NULL CHECK (job_type IN ('incremental','full_audit')),
  41. status VARCHAR(20) NOT NULL,
  42. statistics JSONB NOT NULL DEFAULT '{}'::jsonb,
  43. last_error VARCHAR(1000),
  44. started_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  45. finished_at TIMESTAMPTZ
  46. );
  47. """)
  48. def downgrade() -> None:
  49. pass