277f9b16a2
群(sid)/活动池/转链(带sid)/美团 query_order 按 sid 对账/按群统计;
短链 /c/{code} 记点击(PV/UV)→302 跳美团,点击→下单漏斗。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
62 lines
2.5 KiB
Python
62 lines
2.5 KiB
Python
"""cps_link / cps_click tables (群发短链 + 点击统计)
|
|
|
|
Revision ID: cps_link_tables
|
|
Revises: cps_tables
|
|
Create Date: 2026-06-16 13:20:00.000000
|
|
|
|
群发券链接套一层 /c/{code} 做点击统计:cps_link(短码→美团目标) + cps_click(点击事件)。
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
revision: str = "cps_link_tables"
|
|
down_revision: Union[str, Sequence[str], None] = "cps_tables"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
_NOW = sa.text("CURRENT_TIMESTAMP")
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
"cps_link",
|
|
sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column("code", sa.String(length=16), nullable=False),
|
|
sa.Column("group_id", sa.Integer(), nullable=False),
|
|
sa.Column("activity_id", sa.Integer(), nullable=False),
|
|
sa.Column("sid", sa.String(length=64), nullable=False),
|
|
sa.Column("platform", sa.String(length=20), nullable=False, server_default="meituan"),
|
|
sa.Column("target_url", sa.String(length=1024), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(timezone=True), server_default=_NOW, nullable=False),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
sa.UniqueConstraint("code", name="uq_cps_link_code"),
|
|
)
|
|
op.create_index("ix_cps_link_code", "cps_link", ["code"])
|
|
op.create_index("ix_cps_link_group_id", "cps_link", ["group_id"])
|
|
op.create_index("ix_cps_link_activity_id", "cps_link", ["activity_id"])
|
|
op.create_index("ix_cps_link_sid", "cps_link", ["sid"])
|
|
|
|
op.create_table(
|
|
"cps_click",
|
|
sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
|
|
sa.Column("link_id", sa.Integer(), nullable=False),
|
|
sa.Column("group_id", sa.Integer(), nullable=False),
|
|
sa.Column("sid", sa.String(length=64), nullable=False),
|
|
sa.Column("ip", sa.String(length=64), nullable=True),
|
|
sa.Column("ua", sa.String(length=512), nullable=True),
|
|
sa.Column("clicked_at", sa.DateTime(timezone=True), server_default=_NOW, nullable=False),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
)
|
|
op.create_index("ix_cps_click_link_id", "cps_click", ["link_id"])
|
|
op.create_index("ix_cps_click_group_id", "cps_click", ["group_id"])
|
|
op.create_index("ix_cps_click_sid", "cps_click", ["sid"])
|
|
op.create_index("ix_cps_click_clicked_at", "cps_click", ["clicked_at"])
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("cps_click")
|
|
op.drop_table("cps_link")
|