diff --git a/alembic/versions/019_add_highlight_candidates.py b/alembic/versions/019_add_highlight_candidates.py index 7bfa9b9..e1f1678 100644 --- a/alembic/versions/019_add_highlight_candidates.py +++ b/alembic/versions/019_add_highlight_candidates.py @@ -16,10 +16,10 @@ depends_on = None def upgrade() -> None: - # Pure SQL to avoid all SQLAlchemy enum creation hooks - op.execute("CREATE TYPE highlight_status AS ENUM ('candidate', 'approved', 'rejected')") + # Pure SQL — idempotent with IF NOT EXISTS / exception guards + op.execute("DO $$ BEGIN CREATE TYPE highlight_status AS ENUM ('candidate', 'approved', 'rejected'); EXCEPTION WHEN duplicate_object THEN NULL; END $$") op.execute(""" - CREATE TABLE highlight_candidates ( + CREATE TABLE IF NOT EXISTS highlight_candidates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), key_moment_id UUID NOT NULL UNIQUE REFERENCES key_moments(id) ON DELETE CASCADE, source_video_id UUID NOT NULL REFERENCES source_videos(id) ON DELETE CASCADE, @@ -31,9 +31,9 @@ def upgrade() -> None: updated_at TIMESTAMP NOT NULL DEFAULT now() ) """) - op.execute("CREATE INDEX ix_highlight_candidates_source_video_id ON highlight_candidates (source_video_id)") - op.execute("CREATE INDEX ix_highlight_candidates_score_desc ON highlight_candidates (score DESC)") - op.execute("CREATE INDEX ix_highlight_candidates_status ON highlight_candidates (status)") + op.execute("CREATE INDEX IF NOT EXISTS ix_highlight_candidates_source_video_id ON highlight_candidates (source_video_id)") + op.execute("CREATE INDEX IF NOT EXISTS ix_highlight_candidates_score_desc ON highlight_candidates (score DESC)") + op.execute("CREATE INDEX IF NOT EXISTS ix_highlight_candidates_status ON highlight_candidates (status)") def downgrade() -> None: diff --git a/alembic/versions/020_add_chapter_status_and_sort_order.py b/alembic/versions/020_add_chapter_status_and_sort_order.py index ba67a09..7150e75 100644 --- a/alembic/versions/020_add_chapter_status_and_sort_order.py +++ b/alembic/versions/020_add_chapter_status_and_sort_order.py @@ -16,10 +16,10 @@ depends_on = None def upgrade() -> None: # Pure SQL to avoid SQLAlchemy enum creation hooks - op.execute("CREATE TYPE chapter_status AS ENUM ('draft', 'approved', 'hidden')") - op.execute("ALTER TABLE key_moments ADD COLUMN chapter_status chapter_status NOT NULL DEFAULT 'draft'") - op.execute("ALTER TABLE key_moments ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0") - op.execute("CREATE INDEX ix_key_moments_chapter_status ON key_moments (chapter_status)") + op.execute("DO $$ BEGIN CREATE TYPE chapter_status AS ENUM ('draft', 'approved', 'hidden'); EXCEPTION WHEN duplicate_object THEN NULL; END $$") + op.execute("ALTER TABLE key_moments ADD COLUMN IF NOT EXISTS chapter_status chapter_status NOT NULL DEFAULT 'draft'") + op.execute("ALTER TABLE key_moments ADD COLUMN IF NOT EXISTS sort_order INTEGER NOT NULL DEFAULT 0") + op.execute("CREATE INDEX IF NOT EXISTS ix_key_moments_chapter_status ON key_moments (chapter_status)") op.add_column( "key_moments", sa.Column("sort_order", sa.Integer, nullable=False, server_default="0"),