TimestampMixin was setting default=datetime.now(UTC) — calling the function once at module import time. Every INSERT (and every UPDATE via onupdate) since the app last restarted got stamped with the same process-start timestamp, silently breaking created_at / updated_at on every table that uses the mixin (customers, stores, cards, users, orders, etc.). Pass the _utc_now callable instead so SQLAlchemy invokes it per row. Forward fix only — historical rows on prod since the most recent app restart all read as the start-time microsecond and will need a separate decision on whether to backfill. Found while debugging why a customer + their loyalty card had microsecond-identical created_at timestamps despite being created through separate service calls. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1.1 KiB
1.1 KiB