Как правильно оформить SQLAlchemy 2.0+ модели используя Mapped, mapped_column

Я пытаюсь писать код чисто и без дублирования.
У меня в utils есть генератор uuid и времени

time_manager.py

from datetime import datetime, timedelta, date

def get_now_date() -> date:
    """Getting the current UTC time."""
    return datetime.utcnow().date()


def get_expires_at(days=30) -> date:
    """Return a date N days from now"""
    return (get_now_date() + timedelta(days=days)).date()

generator.py

import uuid

def generate_uuid() -> uuid.UUID:
    '''Generate a new UUID4 object.'''
    return uuid.uuid4()

sessions.py

from sqlalchemy import Date, ForeignKey, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column

from app.database.base import Base
from app.utils.generator import generate_uuid
from app.utils.time_manager import get_now_date, get_expires_at


class Sessions(Base):
    """Stores user sessions."""

    __tablename__ = "sessions"

    id = mapped_column(UUID(as_uuid=True), primary_key=True, default=generate_uuid)
    user_id = mapped_column(UUID(as_uuid=True),ForeignKey("users.id", ondelete="CASCADE"),nullable=False)
    ip_address: Mapped[str] = mapped_column(String, nullable=False)
    client_name: Mapped[str] = mapped_column(String, nullable=False)
    created_at = mapped_column(Date, default=get_now_date, nullable=False)
    expires_at = mapped_column(Date, default=get_expires_at, nullable=False)

Теперь не знаю, как добавить Mapped[] на uuid и дату так, чтобы не дублировался импорт uuid и datetime.

Помогите, пожалуйста - я новичок. И, если будут советы, тоже скажите - буду рад узнать и понять.


Ответы (1 шт):

Автор решения: vanger

Сделать те же импорты в файле sessions.py нормально, так как питон только в первый раз исполнит импортируемый файл, после чего добавит его в sys.modules и в случае "повторного" импорта воспользуется уже загруженной моделью из sys.modules, подробнее в документации питона.

Можете еще посмотреть в сторону аннотации типов. Также можно переложить ответственность за генерацию дефолтных значений на СУБД, например, с помощью параметра server_default.

→ Ссылка