20260716_01_baseline.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. """Create the non-destructive DataOps schema baseline."""
  2. from alembic import op
  3. revision = "20260716_01"
  4. down_revision = None
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE IF NOT EXISTS public.users (
  11. id VARCHAR(100) PRIMARY KEY,
  12. username VARCHAR(50) UNIQUE NOT NULL,
  13. password VARCHAR(100) NOT NULL,
  14. created_at DOUBLE PRECISION NOT NULL,
  15. last_login DOUBLE PRECISION,
  16. is_admin BOOLEAN DEFAULT FALSE
  17. );
  18. CREATE INDEX IF NOT EXISTS idx_users_username
  19. ON public.users(username);
  20. CREATE TABLE IF NOT EXISTS public.data_products (
  21. id SERIAL PRIMARY KEY,
  22. product_name VARCHAR(200) NOT NULL,
  23. product_name_en VARCHAR(200) NOT NULL,
  24. description TEXT,
  25. source_dataflow_id INTEGER,
  26. source_dataflow_name VARCHAR(200),
  27. target_table VARCHAR(200) NOT NULL,
  28. target_schema VARCHAR(100) DEFAULT 'public',
  29. record_count BIGINT DEFAULT 0,
  30. column_count INTEGER DEFAULT 0,
  31. last_updated_at TIMESTAMP,
  32. last_viewed_at TIMESTAMP,
  33. status VARCHAR(50) DEFAULT 'active',
  34. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  35. created_by VARCHAR(100) DEFAULT 'system',
  36. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  37. );
  38. CREATE UNIQUE INDEX IF NOT EXISTS idx_data_products_unique_target
  39. ON public.data_products(target_schema, target_table);
  40. CREATE INDEX IF NOT EXISTS idx_data_products_source_dataflow_id
  41. ON public.data_products(source_dataflow_id);
  42. CREATE INDEX IF NOT EXISTS idx_data_products_status
  43. ON public.data_products(status);
  44. CREATE TABLE IF NOT EXISTS public.data_orders (
  45. id SERIAL PRIMARY KEY,
  46. order_no VARCHAR(50) NOT NULL UNIQUE,
  47. title VARCHAR(200) NOT NULL,
  48. description TEXT NOT NULL,
  49. extracted_domains JSONB,
  50. extracted_fields JSONB,
  51. extraction_purpose TEXT,
  52. graph_analysis JSONB,
  53. can_connect BOOLEAN,
  54. connection_path JSONB,
  55. status VARCHAR(50) NOT NULL DEFAULT 'pending',
  56. reject_reason TEXT,
  57. result_product_id INTEGER,
  58. result_dataflow_id INTEGER,
  59. data_source INTEGER,
  60. created_by VARCHAR(100) NOT NULL DEFAULT 'user',
  61. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  62. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  63. processed_by VARCHAR(100),
  64. processed_at TIMESTAMP
  65. );
  66. CREATE INDEX IF NOT EXISTS idx_data_orders_status
  67. ON public.data_orders(status);
  68. CREATE INDEX IF NOT EXISTS idx_data_orders_created_at
  69. ON public.data_orders(created_at DESC);
  70. CREATE TABLE IF NOT EXISTS public.metadata_review_records (
  71. id BIGSERIAL PRIMARY KEY,
  72. record_type VARCHAR(20) NOT NULL,
  73. source VARCHAR(50) NOT NULL DEFAULT 'ddl',
  74. business_domain_id BIGINT,
  75. new_meta JSONB NOT NULL,
  76. candidates JSONB NOT NULL DEFAULT '[]'::jsonb,
  77. old_meta JSONB,
  78. status VARCHAR(20) NOT NULL DEFAULT 'pending',
  79. resolution_action VARCHAR(30),
  80. resolution_payload JSONB,
  81. notes TEXT,
  82. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  83. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  84. resolved_at TIMESTAMP,
  85. resolved_by VARCHAR(100)
  86. );
  87. CREATE INDEX IF NOT EXISTS idx_metadata_review_records_status
  88. ON public.metadata_review_records(status);
  89. CREATE INDEX IF NOT EXISTS idx_metadata_review_records_created_at
  90. ON public.metadata_review_records(created_at DESC);
  91. CREATE TABLE IF NOT EXISTS public.metadata_version_history (
  92. id BIGSERIAL PRIMARY KEY,
  93. meta_id BIGINT NOT NULL,
  94. change_source VARCHAR(50) NOT NULL DEFAULT 'ddl',
  95. before_snapshot JSONB NOT NULL,
  96. after_snapshot JSONB NOT NULL,
  97. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  98. created_by VARCHAR(100)
  99. );
  100. CREATE INDEX IF NOT EXISTS idx_metadata_version_history_meta_id
  101. ON public.metadata_version_history(meta_id);
  102. CREATE TABLE IF NOT EXISTS public.task_list (
  103. task_id SERIAL PRIMARY KEY,
  104. task_name VARCHAR(255) NOT NULL,
  105. task_description TEXT NOT NULL,
  106. status VARCHAR(20) NOT NULL DEFAULT 'pending',
  107. code_name VARCHAR(255),
  108. code_path VARCHAR(500),
  109. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
  110. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
  111. create_by VARCHAR(100) NOT NULL
  112. );
  113. CREATE INDEX IF NOT EXISTS idx_task_list_status
  114. ON public.task_list(status);
  115. """
  116. )
  117. def downgrade() -> None:
  118. # Baseline rollback deliberately preserves tables that may predate Alembic.
  119. pass