"""cps v2: 活动 payload(淘口令/京东链接) + 群多平台/sid 可空 + 点击 event_type Revision ID: cps_v2_platforms Revises: cps_link_tables Create Date: 2026-06-17 11:00:00.000000 接入淘宝/京东: - cps_activity.payload 淘宝整段淘口令文本 / 京东推广链接(美团仍用 act_id) - cps_group.platforms 该群发哪些平台(多选);sid 改可空(纯淘宝/京东无 sid) - cps_link.sid 可空 + target_url 加长(淘口令较长) - cps_click.event_type visit / copy(淘宝落地页"复制口令") """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql revision: str = "cps_v2_platforms" down_revision: Union[str, Sequence[str], None] = "cps_link_tables" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # 活动:淘宝淘口令 / 京东链接 op.add_column("cps_activity", sa.Column("payload", sa.Text(), nullable=True)) # 群:多平台(现有群都是美团,server_default 回填)+ sid 可空 op.add_column( "cps_group", sa.Column( "platforms", sa.JSON().with_variant(postgresql.JSONB(), "postgresql"), nullable=False, server_default=sa.text("'[\"meituan\"]'::jsonb"), ), ) op.alter_column("cps_group", "sid", existing_type=sa.String(64), nullable=True) # link:sid 可空 + target 加长 op.alter_column("cps_link", "sid", existing_type=sa.String(64), nullable=True) op.alter_column("cps_link", "target_url", existing_type=sa.String(1024), type_=sa.String(2048)) # click:sid 可空 + 事件类型 op.alter_column("cps_click", "sid", existing_type=sa.String(64), nullable=True) op.add_column( "cps_click", sa.Column("event_type", sa.String(16), nullable=False, server_default="visit"), ) def downgrade() -> None: op.drop_column("cps_click", "event_type") op.alter_column("cps_click", "sid", existing_type=sa.String(64), nullable=False) op.alter_column("cps_link", "target_url", existing_type=sa.String(2048), type_=sa.String(1024)) op.alter_column("cps_link", "sid", existing_type=sa.String(64), nullable=False) op.drop_column("cps_group", "platforms") op.alter_column("cps_group", "sid", existing_type=sa.String(64), nullable=False) op.drop_column("cps_activity", "payload")