The ix_project_tasks_parent_task_id index already existed on the production DB, causing migration 057 to fail with DuplicateTableError. Switched all CREATE INDEX statements to raw SQL with IF NOT EXISTS. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
50 lines
2.0 KiB
Python
50 lines
2.0 KiB
Python
"""project collab prep: indexes, task version, comment user_id
|
|
|
|
Revision ID: 057
|
|
Revises: 056
|
|
Create Date: 2025-01-01 00:00:00.000000
|
|
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = "057"
|
|
down_revision = "056"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# 1a. Performance indexes for project_tasks
|
|
# Use IF NOT EXISTS to handle indexes that may already exist on the DB
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_project_id ON project_tasks (project_id)")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_parent_task_id ON project_tasks (parent_task_id) WHERE parent_task_id IS NOT NULL")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_project_tasks_project_updated ON project_tasks (project_id, updated_at DESC)")
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_projects_user_updated ON projects (user_id, updated_at DESC)")
|
|
|
|
# 1b. Add user_id to task_comments for multi-user attribution
|
|
op.add_column(
|
|
"task_comments",
|
|
sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id", ondelete="SET NULL"), nullable=True),
|
|
)
|
|
|
|
# 1c. Add version column to project_tasks for optimistic locking
|
|
op.add_column(
|
|
"project_tasks",
|
|
sa.Column("version", sa.Integer(), server_default="1", nullable=False),
|
|
)
|
|
|
|
# Calendar delta polling index (Phase 4 prep)
|
|
op.execute("CREATE INDEX IF NOT EXISTS ix_events_calendar_updated ON calendar_events (calendar_id, updated_at DESC)")
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index("ix_events_calendar_updated", table_name="calendar_events")
|
|
op.drop_column("project_tasks", "version")
|
|
op.drop_column("task_comments", "user_id")
|
|
op.drop_index("ix_projects_user_updated", table_name="projects")
|
|
op.drop_index("ix_project_tasks_project_updated", table_name="project_tasks")
|
|
op.drop_index("ix_project_tasks_parent_task_id", table_name="project_tasks")
|
|
op.drop_index("ix_project_tasks_project_id", table_name="project_tasks")
|