"""add_unique_constraint_friendship Revision ID: a2b3c4d5e6f7 Revises: f4e8a1b2c3d9 Create Date: 2026-03-29 00:00:00.000000 """ from typing import Sequence, Union from alembic import op from sqlalchemy import text # revision identifiers, used by Alembic. revision: str = 'a2b3c4d5e6f7' down_revision: Union[str, Sequence[str], None] = 'f4e8a1b2c3d9' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # Remove duplicate (requester_id, addressee_id) pairs that already exist, # keeping the earliest row per pair before adding the unique constraint. conn = op.get_bind() conn.execute(text(""" DELETE FROM friendships WHERE id IN ( SELECT id FROM ( SELECT id, ROW_NUMBER() OVER ( PARTITION BY requester_id, addressee_id ORDER BY created_at ) AS rn FROM friendships ) sub WHERE rn > 1 ) """)) op.create_unique_constraint( "uq_friendship_requester_addressee", "friendships", ["requester_id", "addressee_id"], ) def downgrade() -> None: op.drop_constraint("uq_friendship_requester_addressee", "friendships", type_="unique")