2026-09-04 10:20:40 +08:00

40 lines
982 B
Python

"""SQLAlchemy declarative base and common mixins."""
from datetime import UTC, datetime
from typing import Annotated
from uuid import UUID, uuid4
from sqlalchemy import DateTime, func
from sqlalchemy.dialects.postgresql import UUID as PostgreSQLUUID
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
UUIDPrimaryKey = Annotated[
UUID,
mapped_column(PostgreSQLUUID(as_uuid=True), primary_key=True, default=uuid4),
]
class Base(DeclarativeBase):
pass
class UUIDMixin:
id: Mapped[UUIDPrimaryKey]
class TimestampMixin:
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(UTC),
server_default=func.now(),
nullable=False,
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(UTC),
onupdate=lambda: datetime.now(UTC),
server_default=func.now(),
nullable=False,
)