diff --git a/lkeep/database/mixins/__init__.py b/lkeep/database/mixins/__init__.py new file mode 100644 index 0000000..c30336a --- /dev/null +++ b/lkeep/database/mixins/__init__.py @@ -0,0 +1,7 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" diff --git a/lkeep/database/mixins/id_mixins.py b/lkeep/database/mixins/id_mixins.py new file mode 100644 index 0000000..a69b10d --- /dev/null +++ b/lkeep/database/mixins/id_mixins.py @@ -0,0 +1,23 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +import uuid + +from sqlalchemy import UUID +from sqlalchemy.orm import Mapped, mapped_column + + +class IDMixin: + """ + Класс-миксин для добавления уникального идентификатора к объектам. + + :ivar id: Уникальный идентификатор объекта. + :type id: uuid.UUID + """ + + id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) diff --git a/lkeep/database/mixins/timestamp_mixins.py b/lkeep/database/mixins/timestamp_mixins.py new file mode 100644 index 0000000..a5d2d8e --- /dev/null +++ b/lkeep/database/mixins/timestamp_mixins.py @@ -0,0 +1,53 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +import datetime + +from sqlalchemy import DateTime, func +from sqlalchemy.orm import Mapped, mapped_column + + +class CreatedAtMixin: + """ + Класс-миксин, добавляющий атрибут created_at для отслеживания времени создания объектов. + + :ivar created_at: Время создания объекта. + :type created_at: datetime.datetime + """ + + created_at: Mapped[datetime.datetime] = mapped_column( + DateTime(timezone=True), + server_default=func.now(), + default=datetime.datetime.now, + ) + + +class UpdatedAtMixin: + """ + Класс-миксин, добавляющий атрибут `updated_at`, который автоматически обновляется при каждом изменении записи. + + :ivar updated_at: Время последнего обновления записи. + :type updated_at: Mapped[datetime.datetime] + """ + + updated_at: Mapped[datetime.datetime] = mapped_column( + DateTime(timezone=True), server_default=func.now(), onupdate=func.now() + ) + + +class TimestampsMixin(CreatedAtMixin, UpdatedAtMixin): + """ + Класс-миксин для добавления временных меток создания и обновления в классы. + + :ivar created_at: Время создания записи. + :type created_at: datetime.datetime + :ivar updated_at: Время последнего обновления записи. + :type updated_at: datetime.datetime + """ + + pass