diff --git a/back/add_poems_and_filters.py b/back/add_poems_and_filters.py index 3cae199..ee92a0b 100644 --- a/back/add_poems_and_filters.py +++ b/back/add_poems_and_filters.py @@ -1,4 +1,5 @@ from sqlalchemy.orm import Session +from sqlalchemy.sql import text, literal_column from sqlalchemy.ext.asyncio import AsyncSession from typing import Annotated from fastapi import Depends @@ -48,18 +49,45 @@ async def add_poems_to_db(async_db: AsyncSession): async def filter_ann(schema: pydantic_schemas.SortAnnouncements, db: AsyncSession): """Функция для последовательного применения различных фильтров (через схему SortAnnouncements)""" - res = await db.execute(select(orm_models.Announcement)) - res = res.fetchall() - fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения) - # проходим по названиям фильтров и их значениям - for name, filt in fields.items(): - # если фильтр задан - if filt is not None: - d = {name: filt} - # фильтруем - res = await res.filter_by(**d) + # fields = schema.__dict__ # параметры передоваемой схемы SortAnnouncements (ключи и значения) + # # проходим по названиям фильтров и их значениям + # for name, filt_val in fields.items(): + # # создаем выражение sql запроса + # statement = text("SELECT * FROM announcements ") + # # выбираем все строки + # query = await db.execute(statement) + # res = query.all() + # # если фильтр задан + # if filt_val is not None: + # to_intersect_query = await db.execute(select(orm_models.Announcement).where(literal_column(f"announcements.{name}") == filt_val)) + # to_intersect = to_intersect_query.all() + # res = res.intersect(to_intersect) + + # отфильтровываем подходящие объявления + res = await db.execute(select(orm_models.Announcement) + .where(schema.obsolete != None and orm_models.Announcement.obsolete == schema.obsolete + and schema.user_id != None and orm_models.Announcement.user_id == schema.user_id + and schema.metro != None and orm_models.Announcement.metro == schema.metro + and ) + # .where(schema.user_id != None and orm_models.Announcement.user_id == schema.user_id) + # .where(schema.metro != None and orm_models.Announcement.metro == schema.metro) + # .where(schema.category != None and orm_models.Announcement.category == schema.category) + ) + # statement = text("SELECT * FROM announcements " + # "WHERE announcements.obsolete = :obsolete " + # "AND announcements.user_id == :user_id " + # "AND announcements.metro == :metro " + # "AND announcements.category == :category") + + # res = await db.execute(statement, + # {"obsolete": schema.obsolete, + # "user_id": schema.user_id, + # "metro": schema.metro, + # "category": schema.category} + # ) # возвращаем все подходящие объявления - await res.all() + + return res.scalars().all() async def check_obsolete(db: AsyncSession, current_date: datetime.date): @@ -67,7 +95,8 @@ async def check_obsolete(db: AsyncSession, current_date: datetime.date): Функция участвует в процессе обновления поля obsolete у всех объявлений раз в сутки """ # обращаемся ко всем объявлениям бд - announcements = await db.execute(select(orm_models.Announcement)).scalars().all() + query_announcements = await db.execute(select(orm_models.Announcement)) + announcements = query_announcements.scalars().all() # для каждого объявления for ann in announcements: # если просрочено