7564b50f7e
CI/CD Pipeline / Check push changed paths (push) Successful in 4s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 1m46s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 1m51s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 15m40s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 1m50s
CI/CD Pipeline / Build Staging API Image (push) Successful in 18m32s
CI/CD Pipeline / Integration Tests (push) Successful in 3m4s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 3m25s
CI/CD Pipeline / Validate - Style (push) Successful in 3m35s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 44s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m38s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 2m53s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 3m4s
CI/CD Pipeline / Validate - Security (push) Successful in 8m10s
CI/CD Pipeline / Unit Tests (push) Successful in 9m9s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Failing after 9h23m26s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 9h48m20s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 9h22m39s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 9h47m32s
CI/CD Pipeline / PR Build Web Image (push) Failing after 9h47m31s
CI/CD Pipeline / PR Build API Image (push) Failing after 9h47m32s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 9h28m53s
CI/CD Pipeline / CI Gate (push) Failing after 9h22m39s
CI/CD Pipeline / Canary Release to Production (push) Failing after 9h22m37s
CI/CD Pipeline / Build Production Web Image (push) Failing after 9h22m39s
CI/CD Pipeline / Build Production API Image (push) Failing after 9h22m39s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 9h28m53s
CI/CD Pipeline / Frontend Lint (push) Failing after 9h31m49s
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 10h4m41s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
"""#1894: merge title_libraries into scripts — add title_text/title_category/title_config
|
|
|
|
Revision ID: 077_merge_title_libs
|
|
Revises: 076_membership_points
|
|
Create Date: 2026-09-15
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
|
|
from alembic import context, op
|
|
|
|
revision = "077_merge_title_libs"
|
|
down_revision = "076_membership_points"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
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="{}"),
|
|
)
|
|
|
|
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")
|