diff --git a/alembic/versions/20260930_0050_tag_vertical_counts_no_fk.py b/alembic/versions/20260930_0050_tag_vertical_counts_no_fk.py new file mode 100644 index 0000000..3854fb6 --- /dev/null +++ b/alembic/versions/20260930_0050_tag_vertical_counts_no_fk.py @@ -0,0 +1,40 @@ +"""tag_vertical_counts bez klucza obcego do tags (zakleszczenie o 05:00, Sentry GOON-7N). + +Codziennie o 05:00 rusza naraz refresh_taxonomy_counts (co 3 h) i tag_tail_trim (raz +dziennie). Przycinanie kasuje przypisania rule34video, a potem osierocone tagi; DELETE na +tags schodzi kaskada do tag_vertical_counts i czeka na refresh, ktory te wiersze wlasnie +podmienia. Refresh wstawia liczniki z migawki, w ktorej skasowane przypisania jeszcze sa, +a sprawdzenie klucza obcego czeka na blokade tego samego wiersza tags. Od 2026-09-29 +Postgres co rano zabija tag_tail_trim. + +Tabela to kopia liczona od zera co 3 h, wiec klucz obcy nic nie daje: wiersz po +skasowanym tagu znika przy nastepnym odswiezeniu, a /tags i tak zaczyna od tabeli tags. + +Revision ID: 0050_tag_vertical_counts_no_fk +Revises: 0049_playback_origin_sort_idx +Create Date: 2026-09-30 +""" +from __future__ import annotations + +from alembic import op + +revision = "0050_tag_vertical_counts_no_fk" +down_revision: str | None = "0049_playback_origin_sort_idx" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute("SET LOCAL lock_timeout = '5s'") + op.execute( + "ALTER TABLE tag_vertical_counts DROP CONSTRAINT IF EXISTS fk_tag_vertical_counts_tag_id_tags" + ) + + +def downgrade() -> None: + op.execute("SET LOCAL lock_timeout = '5s'") + op.execute("DELETE FROM tag_vertical_counts v WHERE NOT EXISTS (SELECT 1 FROM tags t WHERE t.id = v.tag_id)") + op.execute( + "ALTER TABLE tag_vertical_counts ADD CONSTRAINT fk_tag_vertical_counts_tag_id_tags " + "FOREIGN KEY (tag_id) REFERENCES tags (id) ON DELETE CASCADE" + ) diff --git a/app/models/tag_vertical_count.py b/app/models/tag_vertical_count.py index a3e19f5..1cebba7 100644 --- a/app/models/tag_vertical_count.py +++ b/app/models/tag_vertical_count.py @@ -2,13 +2,14 @@ Wypelnia `refresh_taxonomy_counts`, czyta /tags?vertical=. Ta sama definicja co dawny agregat na zywo: sceny z >= 1 zywym zrodlem z originow wertykalu, bez progu dlugosci. -Patrz migracja 0047. +Patrz migracja 0047. Bez klucza obcego do tags (0050): z nim kasowanie tagow w +tag_tail_trim zakleszczalo sie z odswiezaniem tej tabeli. """ from __future__ import annotations import uuid -from sqlalchemy import ForeignKey, Integer, String +from sqlalchemy import Integer, String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column @@ -19,7 +20,5 @@ class TagVerticalCount(Base): __tablename__ = "tag_vertical_counts" vertical: Mapped[str] = mapped_column(String(32), primary_key=True) - tag_id: Mapped[uuid.UUID] = mapped_column( - UUID(as_uuid=True), ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True - ) + tag_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True) scene_count: Mapped[int] = mapped_column(Integer, nullable=False)