"""drop uq_artist_name — decouple display name from identity/storage Revision ID: 0077 Revises: 0076 Create Date: 2026-07-04 Artist model fragility fix (milestone #130). One `slug` column was doing identity + storage-path + display, and BOTH `name` and `slug` were UNIQUE, so the display name couldn't be edited freely and two genuinely different creators collided. Decouple: `slug` stays the immutable, unique storage/identity key (the on-disk path component — untouched here); `name` becomes freely editable, NON- unique display text. This migration only drops the `uq_artist_name` constraint; no data moves and no path changes. """ from typing import Sequence, Union from alembic import op revision: str = "0077" down_revision: Union[str, None] = "0076" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.drop_constraint("uq_artist_name", "artist", type_="unique") def downgrade() -> None: # Re-adding the UNIQUE would fail if duplicate names now exist; callers that # need to reverse this must dedupe names first. op.create_unique_constraint("uq_artist_name", "artist", ["name"])