Как правильно оформить 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 шт):
Сделать те же импорты в файле sessions.py нормально, так как питон только в первый раз исполнит импортируемый файл, после чего добавит его в sys.modules и в случае "повторного" импорта воспользуется уже загруженной моделью из sys.modules, подробнее в документации питона.
Можете еще посмотреть в сторону аннотации типов. Также можно переложить ответственность за генерацию дефолтных значений на СУБД, например, с помощью параметра server_default.