1217d8cef0
Deploy / Build Production Runtime Images (push) Has been skipped
Deploy / Deploy Production (push) Has been skipped
Deploy / Production Browser E2E (push) Has been skipped
Deploy / Deploy Staging (push) Failing after 210h35m44s
CI/CD Pipeline / Frontend Lint (push) Failing after 210h36m11s
CI/CD Pipeline / Validate Code Quality And Tests (push) Failing after 210h36m17s
84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
"""Phase 3 - 剪辑计划模板:templates + template_segments + template_categories
|
|
|
|
Revision ID: 014
|
|
Revises: 013
|
|
Create Date: 2026-06-29
|
|
|
|
This migration creates three new tables:
|
|
1. templates — 剪辑计划模板主表
|
|
2. template_segments — 模板片段表
|
|
3. template_categories — 模板分类表
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
|
|
from alembic import op
|
|
|
|
# revision identifiers
|
|
revision = "014"
|
|
down_revision = "013"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
conn = op.get_bind()
|
|
|
|
# ── 1. Create templates table ──
|
|
conn.execute(sa.text("""
|
|
CREATE TABLE IF NOT EXISTS templates (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(200) NOT NULL,
|
|
mode VARCHAR(30) NOT NULL,
|
|
category VARCHAR(100) NOT NULL DEFAULT '',
|
|
tags JSONB NOT NULL DEFAULT '[]',
|
|
title_config JSONB NOT NULL DEFAULT '{}',
|
|
subtitle_config JSONB NOT NULL DEFAULT '{}',
|
|
bgm_config JSONB NOT NULL DEFAULT '{}',
|
|
estimated_duration FLOAT NOT NULL DEFAULT 0.0,
|
|
is_active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)
|
|
"""))
|
|
conn.execute(sa.text("CREATE INDEX IF NOT EXISTS ix_templates_user_id ON templates(user_id)"))
|
|
conn.execute(sa.text("CREATE INDEX IF NOT EXISTS ix_templates_mode ON templates(mode)"))
|
|
|
|
# ── 2. Create template_segments table ──
|
|
conn.execute(sa.text("""
|
|
CREATE TABLE IF NOT EXISTS template_segments (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
template_id VARCHAR(36) NOT NULL,
|
|
segment_order INTEGER NOT NULL,
|
|
duration_min FLOAT NOT NULL,
|
|
duration_max FLOAT NOT NULL,
|
|
material_type VARCHAR(20),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)
|
|
"""))
|
|
conn.execute(
|
|
sa.text("CREATE INDEX IF NOT EXISTS ix_template_segments_template_id " "ON template_segments(template_id)")
|
|
)
|
|
|
|
# ── 3. Create template_categories table ──
|
|
conn.execute(sa.text("""
|
|
CREATE TABLE IF NOT EXISTS template_categories (
|
|
id VARCHAR(36) PRIMARY KEY,
|
|
user_id VARCHAR(36) NOT NULL,
|
|
name VARCHAR(100) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)
|
|
"""))
|
|
conn.execute(
|
|
sa.text("CREATE INDEX IF NOT EXISTS ix_template_categories_user_id " "ON template_categories(user_id)")
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
conn = op.get_bind()
|
|
conn.execute(sa.text("DROP TABLE IF EXISTS template_categories"))
|
|
conn.execute(sa.text("DROP TABLE IF EXISTS template_segments"))
|
|
conn.execute(sa.text("DROP TABLE IF EXISTS templates"))
|