The drift check dropped every diff except table/column presence, so a column type or nullability change would slip through. Add modify_type/modify_nullable to the ops it fails on. That immediately surfaced a real pre-existing drift: notifications.created_at was created NULLABLE by migration 0017 but the model has always declared it NOT NULL (Mapped[datetime] + server_default=func.now()). Migration 0066 enforces NOT NULL to match the model — safe, since the server_default has filled every row since day one.
25 lines
999 B
Python
25 lines
999 B
Python
"""notifications.created_at NOT NULL (align schema to the model)
|
|
|
|
The model has always declared `Notification.created_at: Mapped[datetime]` (NOT NULL) with
|
|
`server_default=func.now()`, but migration 0017 created the column without `nullable=False`, so the live
|
|
schema allowed NULL — a model/schema drift the new migration drift-test (E1 S2) surfaced. The
|
|
server_default has filled every row since day one, so no NULLs exist; enforcing NOT NULL just makes the
|
|
schema match the contract the model already promises. Pure DDL, reversible.
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
|
|
revision: str = "0066_notif_created_at_notnull"
|
|
down_revision: Union[str, None] = "0065_plex_detail_fields"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.alter_column("notifications", "created_at", nullable=False)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.alter_column("notifications", "created_at", nullable=True)
|