Files
matchmaking-v2/alembic/versions/0002_pool_and_exhausted.py
T
raulgupta d458ed1b34 Adopt Alembic migrations (match the sibling-service house pattern)
All sibling services on the box manage schema with Alembic (async env, `alembic upgrade head` in the
compose command). matchmaking-v2 was the outlier (Base.metadata.create_all + no migration for the new
user_feed.exhausted_at column). Bring it onto the pattern:
- alembic.ini + alembic/env.py (async, URL from settings.DATABASE_URL, target = Base.metadata) +
  script.py.mako — copied/adapted from user-service.
- versions/0001_baseline: the current prod schema (user_feed WITHOUT exhausted_at + opportunity_state).
- versions/0002_pool_and_exhausted: CREATE user_job_pool + ADD user_feed.exhausted_at (additive).
- Dockerfile: COPY alembic.ini + alembic/. requirements: alembic>=1.13.0.

Verified both paths: fresh DB → upgrade head builds all 3 tables; prod-like (existing tables+data) →
stamp 0001 → upgrade runs ONLY 0002, existing rows survive. 64 tests pass.

PROD ADOPTION (one-time): `alembic stamp 0001_baseline` on RDS before the first deploy, then the
compose's `alembic upgrade head` applies 0002.
2026-06-26 16:14:50 +05:30

34 lines
1.1 KiB
Python

"""warm pool — create user_job_pool + add user_feed.exhausted_at.
The actual change this deploy ships: the warm-pool table and the exhaustion-guard column. Additive +
non-breaking (old code ignores them). On prod: stamp 0001 (existing schema), then this runs.
Revision ID: 0002_pool_and_exhausted
Revises: 0001_baseline
Create Date: 2026-06-26
"""
from alembic import op
import sqlalchemy as sa
revision = "0002_pool_and_exhausted"
down_revision = "0001_baseline"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"user_job_pool",
sa.Column("user_id", sa.String(), primary_key=True),
sa.Column("query_sig", sa.String(), primary_key=True),
sa.Column("job_id", sa.String(), primary_key=True),
sa.Column("job", sa.JSON(), nullable=True),
sa.Column("pooled_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=True),
)
op.add_column("user_feed", sa.Column("exhausted_at", sa.DateTime(timezone=True), nullable=True))
def downgrade() -> None:
op.drop_column("user_feed", "exhausted_at")
op.drop_table("user_job_pool")