"""coupon_session 加 platform_success 列(本次至少领到一张的平台 id 列表) 供 admin「领券数据」算 ②整单成功率 / ③点位成功率(平台粒度)。数据落点:服务端 /step 逐帧 按 trace_id 并集写入(见 app/repositories/coupon_state.merge_session_platform_success)。旧行 NULL 视作空集,已建表环境靠它补列、全新环境顺序应用不重复加列。设计:docs/guides/领券成功率指标-设计与埋点.md。 Revision ID: coupon_session_platform_success Revises: admin_user_plain_password Create Date: 2026-07-07 00:00:00.000000 """ from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.dialects import postgresql from alembic import op # revision identifiers, used by Alembic. revision: str = "coupon_session_platform_success" down_revision: str | Sequence[str] | None = "admin_user_plain_password" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None # PG 用 JSONB,SQLite(本地/测试)退化为通用 JSON(同 model 的 _JSON variant / 建表迁移)。 _JSON = sa.JSON().with_variant(postgresql.JSONB(), "postgresql") def upgrade() -> None: with op.batch_alter_table("coupon_session", schema=None) as batch_op: batch_op.add_column(sa.Column("platform_success", _JSON, nullable=True)) def downgrade() -> None: with op.batch_alter_table("coupon_session", schema=None) as batch_op: batch_op.drop_column("platform_success")