fix(#1894): add alembic migration 077 for title fields auto-deploy
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m0s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m43s
AI Code Review / AI Code Review (pull_request) Successful in 6m23s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 7m28s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 7m28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m43s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m45s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 3m10s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Failing after 4m19s
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 21h50m5s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 21h57m34s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 21h49m24s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 21h56m52s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 21h56m53s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 21h56m53s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 21h56m55s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 21h49m24s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 21h56m50s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 21h56m50s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 22h32m29s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m0s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m43s
AI Code Review / AI Code Review (pull_request) Successful in 6m23s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 7m28s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 7m28s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 2m43s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m45s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 3m10s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Failing after 4m19s
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 21h50m5s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 21h57m34s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 21h49m24s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 21h56m52s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 21h56m53s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 21h56m53s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 21h56m54s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 21h56m55s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 21h49m24s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 21h56m50s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 21h56m50s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 22h32m29s
编程Agent 只写了根目录 migrations/009.sql(手动执行),但没有 alembic 迁移文件, staging/生产部署时 Watchtower 不会自动执行根目录 SQL,导致 title_text/title_category/title_config 三个列缺失、脚本报错。补 alembic 077 迁移确保部署时自动建列+数据迁移。 同时给 migrations/009.sql 加上 IF NOT EXISTS 保护和幂等 INSERT 防止重复执行报错。
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
"""#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=sa.text("''")),
|
||||
)
|
||||
batch.add_column(
|
||||
sa.Column("title_category", sa.String(50), nullable=False, server_default=sa.text("''")),
|
||||
)
|
||||
batch.add_column(
|
||||
sa.Column("title_config", sa.JSON(), nullable=False, server_default=sa.text("'{}'::jsonb")),
|
||||
)
|
||||
|
||||
# 从 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.title_config, '{}'::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")
|
||||
@@ -1,14 +1,14 @@
|
||||
-- 009: 废弃标题库整合到文案库 (Issue #1894)
|
||||
-- 为 scripts 表新增标题相关字段,从 title_libraries 迁移数据
|
||||
-- 日期: 2026-09-15
|
||||
-- 注意:此文件为手动执行 SQL,正式部署通过 alembic 版本 077 自动迁移(含 IF NOT EXISTS 幂等保护)
|
||||
|
||||
-- 1. scripts 表新增字段
|
||||
ALTER TABLE scripts ADD COLUMN title_text VARCHAR(500) NOT NULL DEFAULT '';
|
||||
ALTER TABLE scripts ADD COLUMN title_category VARCHAR(50) NOT NULL DEFAULT '';
|
||||
ALTER TABLE scripts ADD COLUMN title_config JSONB NOT NULL DEFAULT '{}';
|
||||
ALTER TABLE scripts ADD COLUMN IF NOT EXISTS title_text VARCHAR(500) NOT NULL DEFAULT '';
|
||||
ALTER TABLE scripts ADD COLUMN IF NOT EXISTS title_category VARCHAR(50) NOT NULL DEFAULT '';
|
||||
ALTER TABLE scripts ADD COLUMN IF NOT EXISTS title_config JSONB NOT NULL DEFAULT '{}';
|
||||
|
||||
-- 2. 将 title_libraries 中活跃数据迁移到 scripts 表
|
||||
-- 每个用户的每条 title_library 记录,创建一条对应的 script 记录
|
||||
-- 2. 将 title_libraries 中活跃数据迁移到 scripts 表(幂等:已迁移过的跳过)
|
||||
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,
|
||||
@@ -23,4 +23,11 @@ SELECT
|
||||
tl.created_at,
|
||||
tl.updated_at
|
||||
FROM title_libraries tl
|
||||
WHERE tl.is_active = true;
|
||||
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
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user