import uuid from datetime import datetime from sqlalchemy import DateTime, func from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column class Base(DeclarativeBase): # Fetch server-generated defaults (created_at/updated_at) via RETURNING # at flush time — otherwise the async session would need a lazy refresh # on attribute access, which raises MissingGreenlet outside a greenlet. __mapper_args__ = {"eager_defaults": True} class UUIDPrimaryKeyMixin: id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4) class TimestampMixin: created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now() ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() )