base.py 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from __future__ import annotations
  2. from datetime import datetime, timezone
  3. from uuid import uuid4
  4. from sqlalchemy import DateTime, MetaData, String
  5. from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
  6. NAMING_CONVENTION = {
  7. "ix": "ix_%(column_0_label)s",
  8. "uq": "uq_%(table_name)s_%(column_0_name)s",
  9. "ck": "ck_%(table_name)s_%(constraint_name)s",
  10. "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
  11. "pk": "pk_%(table_name)s",
  12. }
  13. def utcnow() -> datetime:
  14. return datetime.now(timezone.utc)
  15. def new_id() -> str:
  16. return uuid4().hex
  17. class Base(DeclarativeBase):
  18. metadata = MetaData(naming_convention=NAMING_CONVENTION)
  19. class UUIDPrimaryKeyMixin:
  20. id: Mapped[str] = mapped_column(
  21. String(32),
  22. primary_key=True,
  23. default=new_id,
  24. )
  25. class TimestampMixin:
  26. created_at: Mapped[datetime] = mapped_column(
  27. DateTime(timezone=True),
  28. default=utcnow,
  29. nullable=False,
  30. )
  31. updated_at: Mapped[datetime] = mapped_column(
  32. DateTime(timezone=True),
  33. default=utcnow,
  34. onupdate=utcnow,
  35. nullable=False,
  36. )