| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- """consolidated schema baseline
- Revision ID: 20260729_03
- Revises:
- Create Date: 2026-07-29
- """
- from __future__ import annotations
- from collections.abc import Sequence
- from datetime import datetime
- import sqlalchemy as sa
- from alembic import op
- from sqlalchemy.dialects import mysql
- revision: str = "20260729_03"
- down_revision: str | None = None
- branch_labels: str | Sequence[str] | None = None
- depends_on: str | Sequence[str] | None = None
- def upgrade() -> None:
- op.create_table(
- "pipeline_run",
- sa.Column("run_id", sa.String(36), primary_key=True),
- sa.Column("dedupe_key", sa.String(191), nullable=False),
- sa.Column("pipeline_key", sa.String(64), nullable=False),
- sa.Column("biz_dt", sa.String(8), nullable=False),
- sa.Column("trigger_type", sa.String(24), nullable=False),
- sa.Column("trigger_source", sa.String(64), nullable=True),
- sa.Column("trigger_reason", sa.Text(), nullable=True),
- sa.Column("run_mode", sa.String(24), nullable=False),
- sa.Column("dry_run", sa.Boolean(), nullable=False),
- sa.Column("status", sa.String(32), nullable=False),
- sa.Column("current_step", sa.String(64), nullable=True),
- sa.Column("deadline_at", sa.DateTime(), nullable=True),
- sa.Column("started_at", sa.DateTime(), nullable=True),
- sa.Column("finished_at", sa.DateTime(), nullable=True),
- sa.Column("heartbeat_at", sa.DateTime(), nullable=True),
- sa.Column("lease_owner", sa.String(191), nullable=True),
- sa.Column("lease_until", sa.DateTime(), nullable=True),
- sa.Column("code_version", sa.String(128), nullable=True),
- sa.Column("config_snapshot_json", sa.JSON(), nullable=False),
- sa.Column("date_snapshot_json", sa.JSON(), nullable=False),
- sa.Column("summary_json", sa.JSON(), nullable=True),
- sa.Column("error_code", sa.String(64), nullable=True),
- sa.Column("error_message", sa.Text(), nullable=True),
- sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.UniqueConstraint("dedupe_key", name="uk_pipeline_run_dedupe_key"),
- mysql_charset="utf8mb4",
- )
- op.create_index(
- "idx_pipeline_run_biz",
- "pipeline_run",
- ["pipeline_key", "biz_dt", "created_at"],
- )
- op.create_index(
- "idx_pipeline_run_status",
- "pipeline_run",
- ["status", "lease_until"],
- )
- op.create_index(
- "idx_pipeline_run_deadline",
- "pipeline_run",
- ["status", "deadline_at"],
- )
- op.create_table(
- "pipeline_step_run",
- sa.Column("step_run_id", sa.String(36), primary_key=True),
- sa.Column(
- "run_id",
- sa.String(36),
- sa.ForeignKey("pipeline_run.run_id", ondelete="CASCADE"),
- nullable=False,
- ),
- sa.Column("step_key", sa.String(64), nullable=False),
- sa.Column("step_order", sa.Integer(), nullable=False),
- sa.Column("attempt", sa.Integer(), nullable=False),
- sa.Column("status", sa.String(32), nullable=False),
- sa.Column("critical", sa.Boolean(), nullable=False),
- sa.Column("dependency_snapshot_json", sa.JSON(), nullable=False),
- sa.Column("input_snapshot_json", sa.JSON(), nullable=False),
- sa.Column("timeout_seconds", sa.Integer(), nullable=False),
- sa.Column("max_attempts", sa.Integer(), nullable=False),
- sa.Column("retryable", sa.Boolean(), nullable=False),
- sa.Column("next_retry_at", sa.DateTime(), nullable=True),
- sa.Column("started_at", sa.DateTime(), nullable=True),
- sa.Column("finished_at", sa.DateTime(), nullable=True),
- sa.Column("heartbeat_at", sa.DateTime(), nullable=True),
- sa.Column("lease_owner", sa.String(191), nullable=True),
- sa.Column("lease_until", sa.DateTime(), nullable=True),
- sa.Column("exit_code", sa.Integer(), nullable=True),
- sa.Column("result_summary_json", sa.JSON(), nullable=True),
- sa.Column("error_code", sa.String(64), nullable=True),
- sa.Column("error_message", sa.Text(), nullable=True),
- sa.Column("log_uri", sa.String(1024), nullable=True),
- sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.UniqueConstraint(
- "run_id",
- "step_key",
- "attempt",
- name="uk_pipeline_step_run_attempt",
- ),
- mysql_charset="utf8mb4",
- )
- op.create_index(
- "idx_pipeline_step_claim",
- "pipeline_step_run",
- ["status", "next_retry_at", "step_order"],
- )
- op.create_index(
- "idx_pipeline_step_run",
- "pipeline_step_run",
- ["run_id", "step_order", "attempt"],
- )
- op.create_index(
- "idx_pipeline_step_lease",
- "pipeline_step_run",
- ["status", "lease_until"],
- )
- op.create_table(
- "pipeline_lock",
- sa.Column("lock_key", sa.String(191), primary_key=True),
- sa.Column("owner_run_id", sa.String(36), nullable=False),
- sa.Column("owner_instance", sa.String(191), nullable=False),
- sa.Column("lease_until", sa.DateTime(), nullable=False),
- sa.Column("heartbeat_at", sa.DateTime(), nullable=False),
- sa.Column("version", sa.BigInteger(), nullable=False),
- sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- mysql_charset="utf8mb4",
- )
- pipeline_lock = sa.table(
- "pipeline_lock",
- sa.column("lock_key", sa.String()),
- sa.column("owner_run_id", sa.String()),
- sa.column("owner_instance", sa.String()),
- sa.column("lease_until", sa.DateTime()),
- sa.column("heartbeat_at", sa.DateTime()),
- sa.column("version", sa.BigInteger()),
- )
- epoch = datetime(1970, 1, 1)
- op.bulk_insert(
- pipeline_lock,
- [
- {
- "lock_key": "pipeline:claim_guard",
- "owner_run_id": "control-plane",
- "owner_instance": "claim-coordinator",
- "lease_until": epoch,
- "heartbeat_at": epoch,
- "version": 1,
- }
- ],
- )
- op.create_table(
- "pipeline_outbox",
- sa.Column("outbox_id", sa.String(36), primary_key=True),
- sa.Column(
- "run_id",
- sa.String(36),
- sa.ForeignKey("pipeline_run.run_id", ondelete="CASCADE"),
- nullable=False,
- ),
- sa.Column(
- "step_run_id",
- sa.String(36),
- sa.ForeignKey("pipeline_step_run.step_run_id", ondelete="CASCADE"),
- nullable=False,
- ),
- sa.Column("effect_type", sa.String(64), nullable=False),
- sa.Column("idempotency_key", sa.String(191), nullable=False),
- sa.Column("payload_hash", sa.String(64), nullable=False),
- sa.Column("payload_json", sa.JSON(), nullable=True),
- sa.Column("payload_uri", sa.String(1024), nullable=True),
- sa.Column("status", sa.String(32), nullable=False),
- sa.Column("dry_run", sa.Boolean(), nullable=False),
- sa.Column("record_error", sa.Text(), nullable=True),
- sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False),
- sa.UniqueConstraint(
- "idempotency_key",
- name="uk_pipeline_outbox_idempotency",
- ),
- mysql_charset="utf8mb4",
- )
- op.create_index(
- "idx_pipeline_outbox_run",
- "pipeline_outbox",
- ["run_id", "step_run_id"],
- )
- op.create_index(
- "idx_pipeline_outbox_status",
- "pipeline_outbox",
- ["status", "created_at"],
- )
- op.create_table(
- "agent_document_injection",
- sa.Column("id", sa.BigInteger(), autoincrement=True, nullable=False),
- sa.Column(
- "agent_name",
- sa.String(length=128),
- nullable=False,
- comment="Agent name",
- ),
- sa.Column(
- "content",
- sa.Text().with_variant(mysql.LONGTEXT(), "mysql"),
- nullable=False,
- comment="Document content injected after the base system prompt",
- ),
- sa.Column(
- "enabled",
- sa.Integer(),
- server_default=sa.text("1"),
- nullable=False,
- comment="Whether the document injection is active",
- ),
- sa.Column(
- "create_time",
- sa.DateTime(),
- server_default=sa.func.now(),
- nullable=False,
- ),
- sa.Column(
- "update_time",
- sa.DateTime(),
- server_default=sa.func.now(),
- nullable=False,
- ),
- sa.PrimaryKeyConstraint("id"),
- sa.UniqueConstraint(
- "agent_name",
- name="uk_agent_document_injection_agent_name",
- ),
- mysql_charset="utf8mb4",
- )
- op.create_index(
- "ix_agent_document_injection_agent_name",
- "agent_document_injection",
- ["agent_name"],
- )
- def downgrade() -> None:
- op.drop_index(
- "ix_agent_document_injection_agent_name",
- table_name="agent_document_injection",
- )
- op.drop_table("agent_document_injection")
- op.drop_index("idx_pipeline_outbox_status", table_name="pipeline_outbox")
- op.drop_index("idx_pipeline_outbox_run", table_name="pipeline_outbox")
- op.drop_table("pipeline_outbox")
- op.drop_table("pipeline_lock")
- op.drop_index("idx_pipeline_step_lease", table_name="pipeline_step_run")
- op.drop_index("idx_pipeline_step_run", table_name="pipeline_step_run")
- op.drop_index("idx_pipeline_step_claim", table_name="pipeline_step_run")
- op.drop_table("pipeline_step_run")
- op.drop_index("idx_pipeline_run_deadline", table_name="pipeline_run")
- op.drop_index("idx_pipeline_run_status", table_name="pipeline_run")
- op.drop_index("idx_pipeline_run_biz", table_name="pipeline_run")
- op.drop_table("pipeline_run")
|