From f30fe14ff888f9c04f416145d615552a0cf3fa35 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 15 Sep 2026 22:14:36 +0800 Subject: [PATCH] =?UTF-8?q?fix(#1894):=20fix=20alembic=20revision=20chain?= =?UTF-8?q?=20=E2=80=94=20rename=20077=E2=86=92076=20(no=20076=20existed),?= =?UTF-8?q?=20set=20down=5Frevision=20to=20075=5Fadd=5Fsentence=5Ftimings,?= =?UTF-8?q?=20add=20postgresql=20dialect=20guard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KeyError: '076_membership_points' broke alembic upgrade on CI (Postgres). No membership_points migration ever existed (PR #1919 added points without a new alembic revision). Our migration should chain from 075_add_sentence_timings, the actual head on develop. --- .../076_merge_title_library_into_scripts.py | 68 +++++++++++++++++++ .../077_merge_title_library_into_scripts.py | 64 ----------------- 2 files changed, 68 insertions(+), 64 deletions(-) create mode 100644 alembic/versions/076_merge_title_library_into_scripts.py delete mode 100644 alembic/versions/077_merge_title_library_into_scripts.py diff --git a/alembic/versions/076_merge_title_library_into_scripts.py b/alembic/versions/076_merge_title_library_into_scripts.py new file mode 100644 index 000000000..2c1f17866 --- /dev/null +++ b/alembic/versions/076_merge_title_library_into_scripts.py @@ -0,0 +1,68 @@ +"""#1894: merge title_library into scripts — add title_text/title_category/title_config to scripts + +Revision ID: 076_merge_title_library_into_scripts +Revises: 075_add_sentence_timings +Create Date: 2026-09-15 +""" + +import sqlalchemy as sa +from alembic import context, op + +revision = "076_merge_title_library_into_scripts" +down_revision = "075_add_sentence_timings" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # scripts 表新增标题配置三字段 + with op.batch_alter_table("scripts") as batch: + batch.add_column( + sa.Column("title_text", sa.String(500), nullable=False, server_default=""), + ) + batch.add_column( + sa.Column("title_category", sa.String(50), nullable=False, server_default=""), + ) + batch.add_column( + sa.Column("title_config", sa.JSON, nullable=False, server_default="{}"), + ) + + # 从 title_libraries 迁移活跃数据到 scripts(仅 PostgreSQL;SQLite 下无历史数据) + if context.get_context().dialect.name == "postgresql": + conn = op.get_bind() + result = conn.execute(sa.text("SELECT to_regclass('public.title_libraries')")) + if result.scalar() is not None: + conn.execute(sa.text(""" + INSERT INTO scripts + (id, user_id, title, content, segments, tags, + title_text, title_category, title_config, + created_at, updated_at) + SELECT + gen_random_uuid()::TEXT, + tl.user_id, + COALESCE(tl.name, '迁移标题'), + COALESCE(tl.text, ''), + '[]'::JSONB, + COALESCE(tl.tags, '[]'::JSONB), + COALESCE(tl.text, ''), + COALESCE(tl.category, ''), + COALESCE(tl."metadata", '{}'::JSONB), + tl.created_at, + tl.updated_at + FROM title_libraries tl + WHERE tl.is_active = true + AND NOT EXISTS ( + SELECT 1 FROM scripts s + WHERE s.user_id = tl.user_id + AND s.title_text = COALESCE(tl.text, '') + AND s.title_category = COALESCE(tl.category, '') + AND s.created_at = tl.created_at + ) + """)) + + +def downgrade() -> None: + with op.batch_alter_table("scripts") as batch: + batch.drop_column("title_config") + batch.drop_column("title_category") + batch.drop_column("title_text") diff --git a/alembic/versions/077_merge_title_library_into_scripts.py b/alembic/versions/077_merge_title_library_into_scripts.py deleted file mode 100644 index 2e7fe8e58..000000000 --- a/alembic/versions/077_merge_title_library_into_scripts.py +++ /dev/null @@ -1,64 +0,0 @@ -"""#1894: merge title_library into scripts — add title_text/title_category/title_config to scripts - -Revision ID: 077_merge_title_library_into_scripts -Revises: 076_membership_points -Create Date: 2026-09-15 -""" - -import sqlalchemy as sa -from alembic import op - -revision = "077_merge_title_library_into_scripts" -down_revision = "076_membership_points" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - # scripts 表新增标题配置三字段 - with op.batch_alter_table("scripts") as batch: - batch.add_column( - sa.Column("title_text", sa.String(500), nullable=False, server_default=""), - ) - batch.add_column( - sa.Column("title_category", sa.String(50), nullable=False, server_default=""), - ) - batch.add_column( - sa.Column("title_config", sa.JSON, nullable=False, server_default="{}"), - ) - - # 从 title_libraries 迁移活跃数据到 scripts(若 title_libraries 表存在) - conn = op.get_bind() - exists = conn.execute(sa.text("SELECT to_regclass('public.title_libraries') IS NOT NULL")).scalar() - if exists: - conn.execute(sa.text(""" - INSERT INTO scripts (id, user_id, title, content, segments, tags, title_text, title_category, title_config, created_at, updated_at) - SELECT - gen_random_uuid()::TEXT, - tl.user_id, - COALESCE(tl.name, '迁移标题'), - COALESCE(tl.text, ''), - '[]'::JSONB, - COALESCE(tl.tags, '[]'::JSONB), - COALESCE(tl.text, ''), - COALESCE(tl.category, ''), - COALESCE(tl."metadata", '{}'::JSONB), - tl.created_at, - tl.updated_at - FROM title_libraries tl - WHERE tl.is_active = true - AND NOT EXISTS ( - SELECT 1 FROM scripts s - WHERE s.user_id = tl.user_id - AND s.title_text = COALESCE(tl.text, '') - AND s.title_category = COALESCE(tl.category, '') - AND s.created_at = tl.created_at - ) - """)) - - -def downgrade() -> None: - with op.batch_alter_table("scripts") as batch: - batch.drop_column("title_config") - batch.drop_column("title_category") - batch.drop_column("title_text")