"""provenance przypisań performerów do scen Revision ID: 0026_scene_performer_source Revises: 0025_phash_blacklist Create Date: 2026-07-27 `scene_performers` nie zapisywało, KTO przypisał performera do sceny. Przez to nie da się odróżnić obsady pochodzącej z kanonu od performera doklejonego przez tube-search (`_search_base` dopasowuje wynik po JEDNYM tokenie zapytania, więc „Rapture" łapała każdą scenę ze słowem „rapture" — 30 z 72 jej przypisań było fałszywych i trzeba je było przejrzeć ręcznie, bo nie było na to żadnego sygnału). Kolumna nullable, bo dla 4,3 mln istniejących wierszy źródła nie da się odtworzyć — wypełnia się od teraz, przy kolejnych ingestach. """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql revision: str = "0026_scene_performer_source" down_revision: str | None = "0025_phash_blacklist" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def upgrade() -> None: op.add_column( "scene_performers", sa.Column("source_id", postgresql.UUID(as_uuid=True), nullable=True), ) op.create_foreign_key( "fk_scene_performers_source_id_sources", "scene_performers", "sources", ["source_id"], ["id"], ondelete="SET NULL", ) op.create_index("ix_scene_performers_source_id", "scene_performers", ["source_id"]) def downgrade() -> None: op.drop_index("ix_scene_performers_source_id", table_name="scene_performers") op.drop_constraint( "fk_scene_performers_source_id_sources", "scene_performers", type_="foreignkey" ) op.drop_column("scene_performers", "source_id")