"""device_liveness 加 first_protected_at(首次开无障碍时刻) Revision ID: device_first_protected_at Revises: bcfcaf07152b Create Date: 2026-06-25 00:00:00.000000 admin 设备存活页要展示「首次无障碍开启时间」。touch_heartbeat 在 ever_protected 首次翻 true 时记一次(后续心跳不覆盖)。仅新增可空列,SQLite 原生支持 add_column、不用 batch;downgrade 的 drop_column 在 SQLite 走 batch_alter_table 兜底。老设备无此时刻 → 留 NULL(无法准确回填)。 """ from typing import Sequence, Union import sqlalchemy as sa from alembic import op revision: str = "device_first_protected_at" down_revision: Union[str, Sequence[str], None] = "bcfcaf07152b" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.add_column( "device_liveness", sa.Column("first_protected_at", sa.DateTime(timezone=True), nullable=True), ) def downgrade() -> None: with op.batch_alter_table("device_liveness") as batch_op: batch_op.drop_column("first_protected_at")