"""SQLAlchemy 2.0 声明式基类 + 通用 mixin。""" from __future__ import annotations import uuid from datetime import datetime from sqlalchemy import DateTime, Uuid, func, text from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): pass class UuidPk: id: Mapped[uuid.UUID] = mapped_column( Uuid, primary_key=True, server_default=text("gen_random_uuid()") ) class CreatedAt: # TIMESTAMPTZ:服务端 `func.now()` 兜底,无 client 端 default(统一存 UTC)。 created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False ) class TimestampedMixin(CreatedAt): updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False )