2025-10-30 14:41:09 +08:00
|
|
|
from datetime import datetime
|
2025-02-17 17:05:13 +08:00
|
|
|
|
2025-11-20 09:44:39 +08:00
|
|
|
from sqlalchemy import DateTime, func
|
2025-10-30 14:41:09 +08:00
|
|
|
from sqlalchemy.orm import DeclarativeBase, Mapped, MappedAsDataclass, mapped_column
|
|
|
|
|
|
|
|
|
|
from libs.datetime_utils import naive_utc_now
|
|
|
|
|
from libs.uuid_utils import uuidv7
|
2025-11-21 22:45:51 +09:00
|
|
|
|
|
|
|
|
from .engine import metadata
|
|
|
|
|
from .types import StringUUID
|
2025-02-17 17:05:13 +08:00
|
|
|
|
2025-05-21 15:38:03 +08:00
|
|
|
|
|
|
|
|
class Base(DeclarativeBase):
|
|
|
|
|
metadata = metadata
|
2025-09-02 20:13:43 +09:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class TypeBase(MappedAsDataclass, DeclarativeBase):
|
|
|
|
|
"""
|
|
|
|
|
This is for adding type, after all finished, rename to Base.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
metadata = metadata
|
2025-10-30 14:41:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class DefaultFieldsMixin:
|
|
|
|
|
id: Mapped[str] = mapped_column(
|
|
|
|
|
StringUUID,
|
|
|
|
|
primary_key=True,
|
2025-11-20 09:44:39 +08:00
|
|
|
# NOTE: The default serve as fallback mechanisms.
|
2025-10-30 14:41:09 +08:00
|
|
|
# The application can generate the `id` before saving to optimize
|
|
|
|
|
# the insertion process (especially for interdependent models)
|
|
|
|
|
# and reduce database roundtrips.
|
2025-11-20 09:44:39 +08:00
|
|
|
default=lambda: str(uuidv7()),
|
2025-10-30 14:41:09 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
created_at: Mapped[datetime] = mapped_column(
|
|
|
|
|
DateTime,
|
|
|
|
|
nullable=False,
|
|
|
|
|
default=naive_utc_now,
|
|
|
|
|
server_default=func.current_timestamp(),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
updated_at: Mapped[datetime] = mapped_column(
|
|
|
|
|
__name_pos=DateTime,
|
|
|
|
|
nullable=False,
|
|
|
|
|
default=naive_utc_now,
|
|
|
|
|
server_default=func.current_timestamp(),
|
|
|
|
|
onupdate=func.current_timestamp(),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def __repr__(self) -> str:
|
|
|
|
|
return f"<{self.__class__.__name__}(id={self.id})>"
|