| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- from __future__ import annotations
- from datetime import datetime, timezone
- from uuid import uuid4
- from sqlalchemy import DateTime, MetaData, String
- from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
- NAMING_CONVENTION = {
- "ix": "ix_%(column_0_label)s",
- "uq": "uq_%(table_name)s_%(column_0_name)s",
- "ck": "ck_%(table_name)s_%(constraint_name)s",
- "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
- "pk": "pk_%(table_name)s",
- }
- def utcnow() -> datetime:
- return datetime.now(timezone.utc)
- def new_id() -> str:
- return uuid4().hex
- class Base(DeclarativeBase):
- metadata = MetaData(naming_convention=NAMING_CONVENTION)
- class UUIDPrimaryKeyMixin:
- id: Mapped[str] = mapped_column(
- String(32),
- primary_key=True,
- default=new_id,
- )
- class TimestampMixin:
- created_at: Mapped[datetime] = mapped_column(
- DateTime(timezone=True),
- default=utcnow,
- nullable=False,
- )
- updated_at: Mapped[datetime] = mapped_column(
- DateTime(timezone=True),
- default=utcnow,
- onupdate=utcnow,
- nullable=False,
- )
|