gabriel / musehub public

0047_proposal_dependency_and_simulation_tables.py file-level

at sha256:3 · View file ↗ · Intel ↗

History
1 files
1 commits
0 hotspots
0 🧊 dead
0 💥 blast risk
sha256:0 fix: fall back to any indexed mpack in read_object_bytes when push mpac… · gabriel · Jun 17, 2026
1 """Create musehub_proposal_dependencies and musehub_proposal_simulations tables (issue #37 Phase 1c)
2
3 Revision ID: 0047
4 Revises: 0046
5 """
6 from __future__ import annotations
7
8 import sqlalchemy as sa
9 from alembic import op
10 from sqlalchemy.dialects.postgresql import JSONB
11
12 revision: str = "0047"
13 down_revision: str = "0046"
14 branch_labels = None
15 depends_on = None
16
17
18 def upgrade() -> None:
19 op.create_table(
20 "musehub_proposal_dependencies",
21 sa.Column("dep_id", sa.String(128), primary_key=True, nullable=False),
22 sa.Column("dependent_proposal_id", sa.String(128), sa.ForeignKey("musehub_proposals.proposal_id", ondelete="CASCADE"), nullable=False),
23 sa.Column("dependency_proposal_id", sa.String(128), sa.ForeignKey("musehub_proposals.proposal_id", ondelete="CASCADE"), nullable=False),
24 sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("NOW()")),
25 sa.UniqueConstraint("dependent_proposal_id", "dependency_proposal_id", name="uq_musehub_prop_dep_edge"),
26 )
27 op.create_index("ix_musehub_prop_deps_dependent", "musehub_proposal_dependencies", ["dependent_proposal_id"])
28 op.create_index("ix_musehub_prop_deps_dependency", "musehub_proposal_dependencies", ["dependency_proposal_id"])
29
30 op.create_table(
31 "musehub_proposal_simulations",
32 sa.Column("simulation_id", sa.String(128), primary_key=True, nullable=False),
33 sa.Column("proposal_id", sa.String(128), sa.ForeignKey("musehub_proposals.proposal_id", ondelete="CASCADE"), nullable=False),
34 sa.Column("simulation_type", sa.String(50), nullable=False),
35 sa.Column("from_branch_commit_id", sa.String(128), nullable=False, server_default=""),
36 sa.Column("result", JSONB, nullable=False, server_default="{}"),
37 sa.Column("duration_ms", sa.Integer, nullable=False, server_default="0"),
38 sa.Column("created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("NOW()")),
39 sa.Column("expires_at", sa.DateTime(timezone=True), nullable=True),
40 sa.UniqueConstraint("proposal_id", "simulation_type", name="uq_musehub_prop_sim"),
41 )
42 op.create_index("ix_musehub_prop_sim_proposal", "musehub_proposal_simulations", ["proposal_id"])
43
44
45 def downgrade() -> None:
46 op.drop_table("musehub_proposal_simulations")
47 op.drop_table("musehub_proposal_dependencies")