Перейти к содержанию

Модели (Models)

Описание моделей SQLAlchemy, используемых в проекте.

app.models.Product

Bases: TimestampMixin, Base

Source code in app/models.py
class Product(TimestampMixin, Base):
    __tablename__ = "products"

    gift_id: Mapped[str] = mapped_column(Text, primary_key=True)
    title: Mapped[str] = mapped_column(Text, nullable=False)
    description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    price: Mapped[Optional[float]] = mapped_column(sa.Numeric, nullable=True)
    currency: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    image_url: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    product_url: Mapped[str] = mapped_column(Text, nullable=False)
    merchant: Mapped[Optional[str]] = mapped_column(Text, nullable=True, index=True)
    category: Mapped[Optional[str]] = mapped_column(Text, nullable=True, index=True)
    raw: Mapped[Optional[dict]] = mapped_column(sa.dialects.postgresql.JSONB, nullable=True)
    is_active: Mapped[bool] = mapped_column(sa.Boolean, server_default="true", index=True)
    content_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    content_hash: Mapped[Optional[str]] = mapped_column(Text, nullable=True)

    # LLM Scoring
    llm_gift_score: Mapped[Optional[float]] = mapped_column(sa.Float, nullable=True, index=True)
    llm_gift_reasoning: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    llm_gift_vector: Mapped[Optional[dict]] = mapped_column(sa.dialects.postgresql.JSONB, nullable=True)
    llm_scoring_model: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    llm_scoring_version: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
    llm_scored_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)

Attributes

gift_id = mapped_column(Text, primary_key=True) class-attribute instance-attribute

title = mapped_column(Text, nullable=False) class-attribute instance-attribute

description = mapped_column(Text, nullable=True) class-attribute instance-attribute

price = mapped_column(sa.Numeric, nullable=True) class-attribute instance-attribute

app.models.ParsingSource

Bases: TimestampMixin, Base

Source code in app/models.py
class ParsingSource(TimestampMixin, Base):
    __tablename__ = "parsing_sources"

    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)
    url: Mapped[str] = mapped_column(Text, nullable=False, unique=True)
    type: Mapped[str] = mapped_column(String, nullable=False)  # hub, list, product, sitemap
    site_key: Mapped[str] = mapped_column(String, nullable=False, index=True)  # mrgeek, ozon, etc.
    strategy: Mapped[str] = mapped_column(String, server_default="deep")  # deep, discovery
    priority: Mapped[int] = mapped_column(sa.Integer, server_default="50", index=True)
    refresh_interval_hours: Mapped[int] = mapped_column(sa.Integer, server_default="24")
    last_synced_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
    next_sync_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)
    is_active: Mapped[bool] = mapped_column(sa.Boolean, server_default="true", index=True)
    config: Mapped[Optional[dict]] = mapped_column(sa.dialects.postgresql.JSONB, nullable=True)

app.models.CategoryMap

Bases: TimestampMixin, Base

Source code in app/models.py
class CategoryMap(TimestampMixin, Base):
    __tablename__ = "category_maps"

    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True, autoincrement=True)
    external_name: Mapped[str] = mapped_column(String, nullable=False, unique=True)
    internal_category_id: Mapped[Optional[int]] = mapped_column(sa.Integer, nullable=True)
    is_verified: Mapped[bool] = mapped_column(sa.Boolean, server_default="false")