49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
"""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")
|